Публічний реєстр
Звіт про здоров'я програмного забезпеченнясхема 0.27.0 · метрики 1.13.0 · 2026-07-30 03:34 UTC

Yan-Acadenice / BYAN

Des agent IA mais intelligent qui respect toute les bonne pratique de conception

JavaScript · TypeScriptMIT★ 8 зірок⑂ 0 форківз лют. 2026 р.Переглянути на GitHub ↗

Yan-Acadenice/BYAN має індекс здоров’я 54 зі 100, що відповідає смузі «Помірний». Найвищий показник — Vitality (83/100), найнижчий — Security (31/100). Останнє оновлення було 1 день тому. Більшість нещодавньої роботи виконує один учасник.

54
загалом / 100
Помірний

Індекс здоров'я програмного забезпечення

Метрики згруповано у зважені категорії на шкалі 1–100. Загальна оцінка починається як їхнє середнє; коли публічні дані активують Політику юрисдикцій високого ризику, рейтинг коригується й отримує верхню межу 49 («Під ризиком»). Готовність до ШІ не входить до індексу.

54
Відмінний85-100Зразковий; відповідає практично всім перевіреним критеріям
Добрий70-84Здоровий; незначні прогалини
Помірний50-69Прийнятний, але з помітними прогалинами; рекомендовано перевірку
У зоні ризику30-49Суттєві слабкі місця; впровадження потребує обережності
Критичний1-29Серйозні проблеми (покинутий, єдиний мейнтейнер, без базової гігієни)
ЖиттєздатністьСпільнота тавпровадженняСталість таврядуванняІнженернаякістьБезпекаГотовність доШІ

Профіль оцінок

Кожна вісь — окрема категорія. Форма важить більше, ніж середнє: здоровий об'єкт заповнює всю фігуру, тоді як профіль із піками та провалами означає, що сила в одному вимірі маскує ризик в іншому.

Власність

Yan Bourquard-AniaОсобистий обліковий запис
5 підписників18 публічних репозиторіївз серп. 2022 р.Acadenice

Цей репозиторій належить особистому обліковому запису. Проєкт з єдиним власником несе більший ризик безперервності, ніж підтримуваний організацією.

Пакетні екосистеми

РеєстрПакетВерсіяЗавантажень / місВерсіїОстання публікаціяТеги
npmcreate-byan-agent2.59.14 9771118 днів томуbyanaimulti-agentworkflowagent-builderbmadmerise-agiletddvoice-dictationwhisperturbo-whisper

Метрики за категоріями

Життєздатність

Чи живий проєкт — чи пишеться код і чи виходять релізи?

83Добрий · 22% загального індексу
Як обчислюється оцінка
36/36Свіжість push — останній push 1 дн. тому
14.5/36Ритм комітів — 21/52 тижнів із комітами
18/18Обсяг комітів — 673 комітів за останній рік
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Використані вхідні дані
commits_last_year673
human_commit_share1
days_since_last_push1
active_weeks_last_year21
Як обчислюється оцінка
27/27Випускає релізи — опубліковано 15 релізів
36/36Свіжість релізів — останній реліз 6 дн. тому
27/27Ритм релізів — реліз кожні ~0,1 дн.
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Використані вхідні дані
releases_count15
latest_release_tagdesktop-v1.2.12
releases_from_tagsні
days_since_latest_release6
mean_days_between_releases0,1

Спільнота та впровадження

Чи має проєкт користувачів, завантаження, увагу та влаштовані умови для контриб’юторів?

39У зоні ризику · 18% загального індексу
Як обчислюється оцінка
13.7/60Зірки — 8 зірок
0/25Форки — 0 форків
0/15Спостерігачі — 0 спостерігачів
Використані вхідні дані
forks0
stars8
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Як обчислюється оцінка
22.5/22.5README
22.5/22.5Ліцензія — визнана ліцензія (MIT)
0/18Настанови CONTRIBUTING
0/13.5Кодекс поведінки
0/7.2Шаблон issue
0/6.3Шаблон PR
Використані вхідні дані
has_readmeтак
has_licenseтак
has_contributingні
has_issue_templateні
has_code_of_conductні
has_pull_request_templateні
Як обчислюється оцінка
49.3/80Щомісячні завантаження — 4 977 завантажень/місяць у npm
0/20Залежні пакети в реєстрі — ця екосистема цього не повідомляє
Використані вхідні дані
packagescreate-byan-agent
dependents
ecosystemsnpm
total_downloads
monthly_downloads4 977
Виключено з оцінювання (немає даних або не застосовно): Залежні пакети в реєстрі. Залишкові ваги перенормовано.

Сталість та врядування

Чи переживе проєкт своїх людей — бас-фактор, реактивність, хто за ним стоїть і як супроводжуються пакети?

34У зоні ризику · 24% загального індексу
Як обчислюється оцінка
9/54Бас-фактор — на 1 контриб’ютор(ів) припадає половина всіх комітів
0/22.5Розподіл комітів — головний контриб’ютор — автор 100% комітів
1.4/13.5Широта контриб’юторів — 1 контриб’юторів
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Використані вхідні дані
bus_factor1
contributors_sampled1
top_contributor_share1
Як обчислюється оцінка
0/46.8Вирішення issue — немає issue або даних
0/38.3Прийняття PR — немає вирішених pull request-ів або даних
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Використані вхідні дані
merged_prs0
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Виключено з оцінювання (немає даних або не застосовно): Вирішення issue, Прийняття PR. Залишкові ваги перенормовано.

Власність та опіка

41У зоні ризику
Як обчислюється оцінка
10/30Підтримка власника — особистий (користувацький) обліковий запис
0/20Верифікований домен — не застосовно до користувацьких облікових записів
5.6/25Охоплення власника — 5 підписників у Yan-Acadenice
17.2/25Послужний список — 18 публічних репозиторіїв, вік облікового запису ~3 р.
Використані вхідні дані
followers5
owner_typeUser
is_verified
owner_loginYan-Acadenice
public_repos18
account_age_days1 449
Виключено з оцінювання (немає даних або не застосовно): Верифікований домен. Залишкові ваги перенормовано.

Супровід пакетів

100Відмінний
Як обчислюється оцінка
25/25Опубліковано й доступно — 1 пакет(ів) у npm
35/35Свіжість публікацій — остання публікація 8 дн. тому
20/20Історія версій — 111 опублікованих версій
20/20Не застарілий — активний, не deprecated і не yanked
Використані вхідні дані
packagescreate-byan-agent
ecosystemsnpm
any_deprecatedні
min_days_since_publish8

Інженерна якість

Чи наявні базові інженерні практики та документація?

78Добрий · 20% загального індексу
Як обчислюється оцінка
24/24Процеси CI — 3 процес(ів) CI
24/24Наявні тести
16/16Конфігурація лінтера — .eslintrc.js, eslint.config.mjs
0/9.6Pre-commit-хуки
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — немає даних
Використані вхідні дані
has_ciтак
has_testsтак
has_editorconfigні
has_linter_configтак
has_precommit_configні
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: CI-Tests. Залишкові ваги перенормовано.
Як обчислюється оцінка
30/30README
25/25Каталог документації
0/15Сайт документації / домашня сторінка
10/10Опис репозиторію
0/10Теми
10/10Wiki
Використані вхідні дані
topics
has_wikiтак
homepage
has_readmeтак
has_docs_dirтак
has_descriptionтак

Безпека

Чи міцні видимі практики безпеки й ланцюга постачання, без непослабленої пов’язаності з юрисдикціями високого ризику?

31У зоні ризику · 16% загального індексу

Стан безпеки

31У зоні ризику
Як обчислюється оцінка
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — немає даних
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Ліцензія — license file detected
7.5/7.5Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — немає даних
2/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 4
0/5SAST — no SAST tool detected
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 73 existing vulnerabilities detected
Використані вхідні дані
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate3,1
Виключено з оцінювання (немає даних або не застосовно): ci_tests, packaging. Залишкові ваги перенормовано.

Готовність до ШІ

Наскільки репозиторій оснащений для розробки та супроводу за участі ШІ-агентів? Незалежний, експериментальний бейдж — вага 0.0, тож він подається окремо і не впливає на загальний індекс здоров'я.

66Помірний · 0% загального індексу
Як обчислюється оцінка
45/45Інструкції для агентів — .claude/CLAUDE.md, AGENTS.md, CLAUDE.md, _byan/agent/claude/claude.md, app/CLAUDE.md, install/templates/.claude/CLAUDE.md, install/templates/_byan/agent/claude/claude.md
0/15Машиночитана документація (llms.txt)
40/40Читабельна історія комітів — намір зазначено у 100 з 100 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
has_llms_txtні
legible_history_share1
agent_instruction_files.claude/CLAUDE.md, AGENTS.md, CLAUDE.md, _byan/agent/claude/claude.md, app/CLAUDE.md, install/templates/.claude/CLAUDE.md, install/templates/_byan/agent/claude/claude.md
agent_instruction_max_bytes17 434
Як обчислюється оцінка
0/18Розгортання однією командою
22/22Автоматизовані тести
11/11Конфігурація лінтера / форматера — .eslintrc.js, eslint.config.mjs
0/11Статична перевірка типів
10/10Відтворюване середовище — Dockerfile, lockfile
10/10Підтверджена практика роботи з агентами — 100 з останніх 100 комітів створено агентом або з його зазначенням
0/8Автоматизоване супроводження — автоматичних оновлень залежностей не виявлено
4/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 4
Використані вхідні дані
has_nixні
has_testsтак
lockfilespackage-lock.json
has_dockerfileтак
typed_languageні
bootstrap_files
has_devcontainerні
has_linter_configтак
typecheck_configs
agent_commit_share1
toolchain_manifests
dependency_bot_commit_share0
Як обчислюється оцінка
0/45Типізований код — JavaScript без конфігурації перевірки типів
54.8/55Керовані розміри файлів — 4/982 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languageJavaScript
largest_source_bytes97 498
source_files_sampled982
oversized_source_files4
Як обчислюється оцінка
0/40Схема API (OpenAPI/GraphQL/proto)
20/20Сервер MCP
40/40Придатні до запуску приклади — examples
Використані вхідні дані
example_dirsexamples
has_mcp_signalтак
api_schema_files

Ключові факти

8зірок GitHub
1контриб'юторів
673комітів за останні 12 місяців
1днів від останнього пушу
15релізів
1бас-фактор
0відкритих issue
npmпакетних екосистем

Попередження щодо збору даних

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • Could not fetch npm package 'update-byan-agent' from its registry
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Докладніше

OpenSSF Scorecard 3.1 / 10
3.1сукупно

Незалежна, не прив'язана до інструментів оцінка безпеки від відкритого проєкту OpenSSF Scorecard. Кожна перевірка винагороджує практику безпеки, а не інструмент конкретного постачальника. Перевірки, які Scorecard не зміг визначити, позначено н/д і виключено з оцінки безпеки (вони ніколи не зараховуються як нуль).Scorecard v5.5.0 · 2026-07-30 03:34 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
н/дCI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
н/дPackagingpackaging workflow not detected
4Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 4
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities73 existing vulnerabilities detected
Прямі залежності 48
РеєстрПакетОбмеження версіїМаніфест
npm@github/copilot-sdk^0.2.2api/package.json
npmbetter-sqlite3^11.0.0api/package.json
npmjsonwebtoken^9.0.0api/package.json
npm@fontsource/inter^5.3.0app/package.json
npm@fontsource/jetbrains-mono^5.3.0app/package.json
npm@fontsource/josefin-sans^5.3.0app/package.json
npmbyan-platform-configfile:../install/packages/platform-configapp/package.json
npmchalk^4.1.2app/package.json
npmelectron-updater^6.8.3app/package.json
npmfs-extra^11.3.6app/package.json
npminquirer^8.2.7app/package.json
npmjs-yaml^4.3.0app/package.json
npmkeytar^7.9.0app/package.json
npmlucide-react^1.14.0app/package.json
npmreact^18.3.1app/package.json
npmreact-dom^18.3.1app/package.json
npmreact-markdown^10.1.0app/package.json
npmremark-gfm^4.0.1app/package.json
npmws^8.21.1app/package.json
npmbyan-platform-config^1.0.0install/package.json
npmchalk^4.1.2install/package.json
npmcommander^11.1.0install/package.json
npmfs-extra^11.2.0install/package.json
npminquirer^8.2.5install/package.json
npmjs-yaml^4.1.0install/package.json
npmora^5.4.1install/package.json
npmws^8.20.0install/package.json
npm@anthropic-ai/claude-code^2.1.114package.json
npm@modelcontextprotocol/sdk^1.29.0package.json
npmbetter-sqlite3^12.9.0package.json
npmbyan-platform-configfile:./install/packages/platform-configpackage.json
npmchalk^4.1.2package.json
npmcommander^11.1.0package.json
npmfs-extra^11.2.0package.json
npminquirer^8.2.5package.json
npmjs-yaml^4.1.0package.json
npmora^5.4.1package.json
npmuuid^13.0.0package.json
npmwinston^3.19.0package.json
npmws^8.20.0package.json
npmbyan-platform-configfile:../install/packages/platform-configupdate-byan-agent/package.json
npmchalk^4.1.2update-byan-agent/package.json
npmcommander^11.1.0update-byan-agent/package.json
npmdiff^5.1.0update-byan-agent/package.json
npmfs-extra^11.2.0update-byan-agent/package.json
npminquirer^8.2.5update-byan-agent/package.json
npmjs-yaml^4.1.0update-byan-agent/package.json
npmora^5.4.1update-byan-agent/package.json
Усі залежності не зібрано

Не вдалося зібрати розв'язаний набір залежностей для цього звіту: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Звіт у форматі JSON машиночитний
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 11295,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "CSS": 65411,
        "HTML": 18871,
        "Shell": 61031,
        "Dockerfile": 1608,
        "JavaScript": 5395449,
        "TypeScript": 1436143
      },
      "pushed_at": "2026-07-28T15:49:33Z",
      "created_at": "2026-02-02T14:00:37Z",
      "owner_type": "User",
      "updated_at": "2026-07-28T15:55:42Z",
      "description": "Des agent IA mais intelligent qui respect toute les bonne pratique de conception",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "JavaScript",
      "significant_languages": [
        "JavaScript",
        "TypeScript"
      ]
    },
    "owner": {
      "blog": null,
      "name": "Yan Bourquard-Ania",
      "type": "User",
      "login": "Yan-Acadenice",
      "company": "Acadenice",
      "location": "Nice",
      "followers": 5,
      "avatar_url": "https://avatars.githubusercontent.com/u/110977877?v=4",
      "created_at": "2022-08-10T10:44:02Z",
      "is_verified": null,
      "public_repos": 18,
      "account_age_days": 1449
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "desktop-v1.2.12",
          "kind": "other",
          "published_at": "2026-07-23T13:19:08Z"
        },
        {
          "tag": "desktop-v1.2.11",
          "kind": "other",
          "published_at": "2026-07-23T13:11:28Z"
        },
        {
          "tag": "desktop-v1.2.10",
          "kind": "other",
          "published_at": "2026-07-23T12:38:16Z"
        },
        {
          "tag": "desktop-v1.2.9",
          "kind": "other",
          "published_at": "2026-07-23T12:24:18Z"
        },
        {
          "tag": "desktop-v1.2.8",
          "kind": "other",
          "published_at": "2026-07-23T10:22:04Z"
        },
        {
          "tag": "desktop-v1.2.7",
          "kind": "other",
          "published_at": "2026-07-23T09:19:42Z"
        },
        {
          "tag": "desktop-v1.2.6",
          "kind": "other",
          "published_at": "2026-07-23T09:04:42Z"
        },
        {
          "tag": "desktop-v1.2.5",
          "kind": "other",
          "published_at": "2026-07-23T08:17:15Z"
        },
        {
          "tag": "desktop-v1.2.4",
          "kind": "other",
          "published_at": "2026-07-22T17:17:38Z"
        },
        {
          "tag": "desktop-v1.2.3",
          "kind": "other",
          "published_at": "2026-07-22T16:45:50Z"
        },
        {
          "tag": "desktop-v1.2.2",
          "kind": "other",
          "published_at": "2026-07-22T16:27:14Z"
        },
        {
          "tag": "desktop-v1.2.1",
          "kind": "other",
          "published_at": "2026-07-22T16:08:30Z"
        },
        {
          "tag": "desktop-v1.2.0",
          "kind": "other",
          "published_at": "2026-07-22T15:47:06Z"
        },
        {
          "tag": "desktop-v1.1.0",
          "kind": "other",
          "published_at": "2026-07-22T14:26:09Z"
        },
        {
          "tag": "desktop-v1.0.0",
          "kind": "other",
          "published_at": "2026-07-22T08:29:08Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "594e9be089fb4e67cdd024550baf1ab74573a74e",
          "body": "…e, the two empties\n\nLots 1b through 5 of the design handoff, built by a five-way parallel workflow\nthen integrated, renamed and verified by hand.\n\nWHAT THE FIVE OWNERS BUILT\n\nDecomposed by FILE OWNERSHIP, not by lot: two agents editing LocalChatView at the\nsame time overwrite each other. Each owned\n[…]\ns\nredone.\n\n1056 pass, typecheck and lint clean, build green.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01E6KwJBY6Vfip5gvLupfH5N",
          "is_bot": false,
          "headline": "feat(app): finish the UI rework on AcadeNice — themes, glass, languag…",
          "author_name": "Yan-Shenron",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-28T15:25:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c3d442bbc435b8ef6fa94f44b9faceb59c26e1ff",
          "body": "…writing it\n\nLot 1 of the UI rework, main side. This one is not style: the installer destroyed\nwork silently.\n\nTHE DEFECT\n\nplanOne answered three ways — same content: skip, absent: create, different:\nupdate. That last one covers two opposite situations:\n\n  the TEMPLATE moved since we wrote the file \n[…]\n\nOnboarding.tsx, and the renderer passing acceptedConflicts.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01E6KwJBY6Vfip5gvLupfH5N",
          "is_bot": false,
          "headline": "feat(app): tell a hand-edited file apart from a stale one before over…",
          "author_name": "Yan-Shenron",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-28T12:13:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "db4ccc2be43240766dac706d5bc24dbce6161ab0",
          "body": "Found by capturing the packaged window rather than by reading code. None of the\nthree would have surfaced any other way.\n\nTHE MONOGRAM\n\nByanLogo hardcodes its colours, so remapping the byan-* ramp onto teal did not\nreach it: the mark was still the old blue-to-cyan gradient on every screen.\n\nNow the \n[…]\n and line.\n\n871 pass, typecheck and lint clean, build green.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01E6KwJBY6Vfip5gvLupfH5N",
          "is_bot": false,
          "headline": "fix(app): the monogram stayed blue, and three more places printed v1.0",
          "author_name": "Yan-Shenron",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-28T11:54:21Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ff80bbb5a3ad6e184f5ff88b0fed54e5b8a61136",
          "body": "…Nice\n\nLot 0 of the UI rework, from the design handoff. Ordered by risk, not by screen:\na chantier ordered by screen produces an app half-migrated in both directions.\n\nTYPOGRAPHY WAS NOT A FOUR-LINE CHANGE\n\nThe handoff calls the font switch \"the best effect/risk ratio of the whole\nchantier: change f\n[…]\nured cost.\n\n869 pass, typecheck and lint clean, build green.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01E6KwJBY6Vfip5gvLupfH5N",
          "is_bot": false,
          "headline": "feat(app): bundle the typography and rebuild the token layer on Acade…",
          "author_name": "Yan-Shenron",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-28T11:34:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "eb111cb8ffae7cf2a8bc85ee2c52ebb91cd27bd7",
          "body": "…ually lived\n\nThree bugs shipped in a row past a green suite: an agent slug the CLI ignores, a\nmessage erased by an opening session, and a command that ate the text typed after\nit. Each lived in the wiring BETWEEN the interface and the bridge — the one path\nno existing proof crossed. Unit tests driv\n[…]\nk on the first translation, since the labels go through t().\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01E6KwJBY6Vfip5gvLupfH5N",
          "is_bot": false,
          "headline": "test(app): drive the real packaged window, the one place the bugs act…",
          "author_name": "Yan-Shenron",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-27T16:39:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "94bf2d2fdb6e1dbe834249df0a5bac0cd2e19c2c",
          "body": "Reported: launching BYAN Desktop threw a web page into the user's browser. A\ndesktop app that does that failed at being one.\n\nCause was outside the app: install/src/webui/server.js called openBrowser(url)\nunconditionally right after listen(), and openBrowser runs `xdg-open`. Electron\nforks that serv\n[…]\nwhich is what this does;\nremoving it is a separate decision.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01E6KwJBY6Vfip5gvLupfH5N",
          "is_bot": false,
          "headline": "fix: the desktop app opened a browser tab when it started its server",
          "author_name": "Yan-Shenron",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-27T16:39:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2e058fb22439c0a7298111271f0f0a836ebdd385",
          "body": "Reported verbatim: \"/byan salut mon reuf\" did nothing. The capture showed why —\nno bubble, no error, no trace. The command arm took the agent slug it needed and\nDISCARDED the rest of the line, so the words never reached the engine.\n\nIt was not only /byan. Five of the ten commands dropped their trail\n[…]\nn this fix is reverted.\n\n868 pass, typecheck and lint clean.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01E6KwJBY6Vfip5gvLupfH5N",
          "is_bot": false,
          "headline": "fix(app): five slash commands silently ate the text typed after them",
          "author_name": "Yan-Shenron",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-27T16:38:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "48e81d4d3d706a83740d68a13f1700a40b5d1f3a",
          "body": "The three existing codex live tests assert a reply arrives and that resume\nchains. None of them said anything about the work being visible DURING a turn,\nwhich is the behaviour the previous commit added.\n\nThe unit suite feeds a captured item.started frame through a fake process. That\npins the mappin\n[…]\n some activity was reported\nwould have certified the defect.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01E6KwJBY6Vfip5gvLupfH5N",
          "is_bot": false,
          "headline": "test(app): prove live that codex reports a command while it runs",
          "author_name": "Yan-Shenron",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-27T16:01:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "dc989874d1a33717da8a8c1b6909bacdbe97995c",
          "body": "…erased\n\nReported as \"j'ai envoye un message, ca fait rien\". The screenshot showed the\ntell: the user's own bubble was absent too. The view appends that bubble before\ncalling the engine, so its absence meant the transcript had been wiped after\nthe send, not that the send never happened.\n\nThis is a r\n[…]\nt reason and for\nexpecting two starts where /byan makes one.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01E6KwJBY6Vfip5gvLupfH5N",
          "is_bot": false,
          "headline": "fix(app): a message typed while a session was opening was sent, then …",
          "author_name": "Yan-Shenron",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-27T15:39:21Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8b6ec73fd1d49eae80e550edd3920853732e9ec9",
          "body": "Diagnosis of \"il fait rien\": /byan opens a session with bmad-byan, and the\nagent then works for 20s+ before its first word. Measured live on claude\n2.1.220 in the exact argv the app uses: 4.1s to init, then alternating\nassistant/user frames (tool calls and their results) plus thinking_tokens.\n\nThe a\n[…]\ne packaged copy, dropping all 31 scripts. Restored from git.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01E6KwJBY6Vfip5gvLupfH5N",
          "is_bot": false,
          "headline": "feat(app): show what the engine is doing instead of a mute spinner",
          "author_name": "Yan-Shenron",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-27T15:02:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5775598ed99c7883211680646501e0b091958069",
          "body": "… had not measured\n\nEight displayed facts were wrong or invented. Found from a screenshot of a\nworking /byan run: the command itself worked, everything around it lied.\n\nChat header and body\n* the empty state said \"envoie un message, une session demarre toute seule\"\n  while the header showed a live s\n[…]\n\nkilled by a named test. 826 pass, typecheck and lint clean.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01E6KwJBY6Vfip5gvLupfH5N",
          "is_bot": false,
          "headline": "fix(app): the chat header and status bar were describing a state they…",
          "author_name": "Yan-Shenron",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-27T14:23:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3a910f87ea0433d309137066fda24dc31bafd1bd",
          "body": "…nores those silently\n\nReported as \"/byan does not seem to work, and it says next session even though I\njust started one\". Both halves were real, and the first is worse than it looks.\n\nMEASURED, claude 2.1.220: `claude --agent byan` with no such agent exits 0,\nanswers normally and simply omits the a\n[…]\nring the bare 'byan' slug fails the new\ntest; restoring the fix returns 34/34 on the view. 810 tests pass, typecheck and\nlint clean.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(app): /byan sent an agent slug no project declares, and claude ig…",
          "author_name": "Yan-Shenron",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-27T13:03:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8b8a8494143e60f8af31621587062b62cc417bf4",
          "body": "…usage, MCP)\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(app): bump 1.4.0 (palette de commandes, moteurs modele/effort, …",
          "author_name": "Yan-Shenron",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-27T11:44:40Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "420044c94d2df2ea1897ca9c35a11302d7bfc882",
          "body": "The panel was nested inside the badge's condition, so it only existed once a\nturn had reported usage. Typing /usage before that flipped the open flag and\nrendered nothing at all — precisely the silent no-op every other command in\nthis view is written to avoid.\n\nThe wrapper is now always mounted (it \n[…]\nes carry usage\n(engine, model, costUsd) — the main-side path was fine, the mount was not.\n\n793 tests pass, typecheck and lint clean.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(app): /usage was a silent no-op before the first measured turn",
          "author_name": "Yan-Shenron",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-27T11:30:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "71391593f025ab5937c5d582fdff2d0de5836312",
          "body": "The first-launch E2E spec started failing on the packaged build, and the cause\nwas not the test being tight: reaching the preview step took over twenty\nseconds. Measured, the walk itself costs 2.7 s for 990 plans — the rest was the\npayload. Each plan carried the full file content, so a first launch \n[…]\n no trust either: apply() already recomputes what it\nwrites from the templates, so a returned body could not have been written back.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "perf(app): onboarding preview no longer ships every file body over IPC",
          "author_name": "Yan-Shenron",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-27T11:22:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c423b4ddadc7c161efa0929dc41a95a46e370976",
          "body": "…rt coverage (F9, F10, F12)\n\nThe local chat gains /usage and /mcp, and the opt-in live suite now pins the\nmodel/effort/usage wire against the real CLIs.\n\nUSAGE (F9). Per-turn records plus per-engine totals, folded in the context and\nreset on newSession, resume and logout. The panel shows one row per\n[…]\nfort=high, without low and without -m.\nThree live cases pass against the installed codex.\n\n792 tests pass, typecheck and lint clean.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(app): session usage panel, MCP management modal, live model/effo…",
          "author_name": "Yan-Shenron",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-27T10:45:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a827cfc2e91d0852e246b0b1019651b0513a470c",
          "body": "… was absent\n\nDiagnosis. .mcp.json launched `node /home/yan/BYAN/_byan/mcp/byan-mcp-server/server.js`.\nThat directory does not exist: the project lives at /home/yan/acadenice/interne/BYAN.\nClaude Code tried to spawn a missing file, the server failed to connect, and\nsessions ran with ZERO byan_* tool\n[…]\n.\n\nNote: MCP servers connect at session start, so this restores the tools from the\nNEXT Claude Code session on, not the current one.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: .mcp.json pointed at a dead path, so the whole byan tool surface…",
          "author_name": "Yan-Shenron",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-27T10:10:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bbf1db946273c770c01f1959a0dc3fc4cb577be0",
          "body": "…and refused (F11)\n\nOne slash implementation now serves BOTH chat surfaces. Chat.tsx drops its\nhand-rolled input filtering, menu state and dropdown markup in favour of\nuseSlashPalette + SlashCommandMenu, and dispatches through parseSlashInput\ninstead of a chain of string-equality tests. The five clo\n[…]\nothing left to complete, '/new' runs\non the first keystroke rather than needing a second.\n\n751 tests pass, typecheck and lint clean.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(app): cloud chat on the shared slash primitive, unknown comm…",
          "author_name": "Yan-Shenron",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-27T09:53:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4d7cf6f45a1fb73543601281cb88127297888b6a",
          "body": "The local chat gets Claude-Code-style controls: a model chip on both engines, an\neffort chip that is ABSENT FROM THE DOM on claude (a greyed control would\nadvertise a setting claude has no flag for), and the shared slash palette above\nthe input. Commands: /model /effort /engine /agent /byan /new /cl\n[…]\ny became a directory path and leaked into the\nstart options; the mock is now key-aware.\n\n35 tests pass on the view plus the palette.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(app): model/effort chips + slash palette in the local chat (F8)",
          "author_name": "Yan-Shenron",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-27T09:42:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3c941a79486b92aaf109259814aa523c56ed2215",
          "body": "The bridge is the trust boundary: the adapters push model and effort straight\ninto argv without re-checking, so this is the only place a bad value can be\nstopped. An invalid model (wrong engine family, or a token carrying a space,\n'=' or a shell metacharacter) and an unknown effort both throw\nINVALI\n[…]\n guards proven falsifiable by mutation: removing the codex gate fails 1\ntest, removing the model validation fails 2. 719 tests pass.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(app): bridge validates model/effort and gates effort to codex (F6)",
          "author_name": "Yan-Shenron",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-27T09:34:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "53096d8778b17bb1fb464ee7d967457ef3043486",
          "body": "…ive (F4, F5, F7)\n\nclaude-engine pushes --model and attaches usage {costUsd, durationMs} on a\nsuccessful result. It deliberately does NOT destructure 'effort': with no local\nbinding, a fake effort setting is structurally impossible rather than merely\nunlikely. Token fields stay absent — claude publi\n[…]\nfalse open flag, which made Escape look broken in any host that wired\nit the obvious way.\n\n711 tests pass, typecheck and lint clean.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(app): model/effort wired into both engines + shared slash primit…",
          "author_name": "Yan-Shenron",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-27T09:30:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7c3836cb2f8b36118046b9a579f88ee9e5997a32",
          "body": "…ract (F2, F3)\n\nOne module now holds the CLI truths so the renderer's pickers and main's\nvalidation cannot drift: EngineId (moved out of main/engines/types.ts, which\nre-exports it), the reasoning-effort enum, model presets and the guards.\n\nTwo facts came from probing the real CLIs, not from memory:\n\n[…]\nreport disjoint halves, and a\nfabricated 0 would read as a measurement. vitest now collects shared/ too\n(same gap that hid preload).\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(app): shared engine-options + model/effort/usage in the IPC cont…",
          "author_name": "Yan-Shenron",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-27T09:05:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "dadd27f99af2652e4b6ad9ece3fd2e5445b93ffc",
          "body": "…roke at runtime\n\nThe renderer key allowlist (commit 12945da) omitted the app. prefix, so\nI18nContext's store.get('app.locale') threw PERMISSION_DENIED on every launch\nof the packaged app — the locale no longer persisted. Caught by the real\nAppImage launch, not by any suite (unit + E2E only exercise\n[…]\nocale, chat.localEngine, chat.pendingCwd, chat.defaults,\nonboarding.projectRoot, login.lastMode) all fall under the allowlist now.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(app): app.locale back in the store allowlist — i18n persistence b…",
          "author_name": "Yan-Shenron",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-27T08:12:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5816cb4a4aaf76595c92799e76d79f70c07fc358",
          "body": "… under the sidebar\n\nThe footer was absolute against the WINDOW (no positioned ancestor), so its\nleft side — the Local/Cloud mode chip F1 promises reachable from every\nscreen — sat under the fixed sidebar (z-50 over z-40), unclickable for real\nusers too. Caught by the switch-mode E2E on the packaged\n[…]\nned ancestor. The keytar E2E key moves into the\nui. namespace (the store channel enforces the renderer key allowlist).\nPackaged-binary E2E: 7/7.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(app): status strip anchored to the content column — mode chip was…",
          "author_name": "Yan-Shenron",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-24T15:34:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a8e519018ca305604f478c38baabdbacd4790114",
          "body": "…, verify deep)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: align bug-hunt workflow with tier doctrine (assess-* on sonnet…",
          "author_name": "Yan-Shenron",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-24T14:53:17Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "30b0b45502f6d911df4c7c2818654775b1909832",
          "body": "…al audit)\n\nReview and 2-lens verification leaves run on sonnet (analysis tier); the\nfinal arbitration of findings stays on the main thread session model.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: reusable byan-desktop-bug-hunt workflow (7-dimension adversari…",
          "author_name": "Yan-Shenron",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-24T14:52:21Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a95c408383a887d28d44a8c7e919ec21482fe62e",
          "body": "…d — live-proven\n\nTwo defects caught by the new opt-in LIVE integration test (BYAN_E2E_CODEX=1)\nagainst the real codex binary: (1) the turn slot was only freed on process\nexit, so a fast follow-up send bounced on 'déjà en cours' — the terminal JSONL\nframe now frees it and the exit handler is guarded\n[…]\nroves two real turns (exec, then exec resume) end to end. Also fixes the\nstale LocalClaudeBridge import in the claude live test (renamed class).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(app): codex turn freed on terminal frame, resume flag set narrowe…",
          "author_name": "Yan-Shenron",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-24T14:51:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "df3e94cc8ecf2b6805f3f368135edd2cd75b1ea4",
          "body": "…mp 1.3.0\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(app): CLAUDE.md moteurs multi-CLI + journal 1.3.0, changelog, bu…",
          "author_name": "Yan-Shenron",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-24T14:45:14Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "394b6d5c3e21789f19befb2a682b4164e57696a9",
          "body": "…ient consolidated\n\nThe CSP e2e assertion was a tautology (passed with the CSP removed) and the\nauto-updater idempotence test asserted nothing — both now fail on a real\nregression. test:live gets cross-env (POSIX-only inline env broke cmd.exe).\nvitest main project now collects preload/** as its head\n[…]\nscarded its argument —\nrenamed initLocalChat(). apiFetch/apiFetchPost/apiFetchDelete share one\napiRequest core instead of three verbatim copies.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(app): honest tests, portable scripts, dead config removed, api cl…",
          "author_name": "Yan-Shenron",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-24T14:41:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "12945daa9ef4b2bf5f10d70764f55a0394ed6bd6",
          "body": "…n local mode\n\nstore.get/set shared the SecureStore namespace with auth.token/auth.mode/\nauth.url — the renderer could read the token through the generic channel. A\nprefix ALLOWLIST (chat. login. onboarding. ui. user.) now guards both ways.\nlogin() broadcasts byan:auth:changed on every success (a di\n[…]\nth that never touches that server.\nchatConversationsCreate/Delete and chatStreamStart are now gated on\nisLocalMode() like every sibling handler.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(app): store key allowlist, native local login, cloud chat gated i…",
          "author_name": "Yan-Shenron",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-24T14:33:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "504adaf85e9106e78a7939dc58e4f18db5e0358f",
          "body": "…fixes\n\nLocalChatView gains an engine switch — codex greyed out when undetected,\nchoice persisted (chat.localEngine), applied to the next session (cli passed\nthrough LocalChatStartOpts). Renderer fixes from the adversarial review:\nforeign-session frames dropped even with no active session (logout le\n[…]\nd failures, App menu-action listener\nstops resubscribing every render, alert() replaced by toasts, one factory for\nthe synthetic system bubbles.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(app): local chat engine switch (claude/codex) + renderer defect …",
          "author_name": "Yan-Shenron",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-24T14:26:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2e7a0fb1797108a1b67b9a01e564ea40687c15e9",
          "body": "…s foreign fields\n\nonboarding.apply no longer writes renderer-supplied paths/content: the project\nroot is re-derived and validated (single absolute root, no traversal) and the\nplans are RECOMPUTED from the templates server-side — the renderer only\nselects which files. updateMcpServer now replaces on\n[…]\n(command/args/env/cwd): a hand-set enabled:false or any unknown field\nsurvives an edit from the app. addMcpServer reuses readForWrite/writeFile.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(app): onboarding apply trust boundary, mcp-config update preserve…",
          "author_name": "Yan-Shenron",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-24T14:16:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "583a6c5e6b6bf5e071f24f7fca2594639f9de9c4",
          "body": "… terminal error listener\n\nsecure-store fallback: the whole read-modify-write runs under the advisory\nlock, writes are atomic (tmp + rename over), a stale lock is reclaimed after\n10s instead of busy-blocking main ~1s per write forever, and values with\nnewlines/edge whitespace are JSON-quoted on disk\n[…]\nd).\nterminal: the detached spawn gets an error listener — an async launch failure\nwas an uncaughtException that killed main without before-quit.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(app): secret store hardened, MCP stop escalates and reaps groups,…",
          "author_name": "Yan-Shenron",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-24T14:12:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c89558a6274cb5733152fbc339924818cdeeccca",
          "body": "Two P2 defects from the adversarial review: (1) the restart setTimeout handle\nwas never stored, so stop() could not cancel it and _resetState cleared the\nstopping flag the timer relied on — the server resurrected after an explicit\nstop; (2) the health-crash path and the killed child's exit handler each\nscheduled a restart for the same crash — double fork, first child leaked.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(app): local server restart timer cancellable and single-flight",
          "author_name": "Yan-Shenron",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-24T14:07:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3f71e463058b2e74822c90b4a09e5927445d3038",
          "body": "The bridge (session map, cap, quit sweep, broadcast) is now engine-agnostic;\neach CLI lives in main/engines/. claude keeps its long-lived stream-json\nprocess; codex runs one process per turn (codex exec --json, JSONL contract\nlive-verified on codex-cli 0.145.0) chained by exec resume <thread_id>, pr\n[…]\nflag and the session cap are re-checked\nafter the async cwd resolution, so a start() in flight during before-quit can\nno longer spawn an orphan.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(app): multi-engine local chat bridge — claude + codex",
          "author_name": "Yan-Shenron",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-24T14:04:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5035fc412094c168e27f5e85f03cb695d612d9ee",
          "body": "…modules during walk\n\nFixes the installer test timeouts: the per-installer walkFiles descended into\nnode_modules then filtered per-file, and the unit tests walked the real\n1000+-file template tree on every call. Shared planTree/planFile/applyPlans,\nprune during descent, and a template-root test seam for hermetic fixtures.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(app): consolidate installers on shared fs-utils, prune node_…",
          "author_name": "Yan-Shenron",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-24T13:07:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "154885106a8b2569d05ce0df8a10b12634c754ea",
          "body": "…12, pieges)\n\nContexte charge automatiquement quand on travaille dans app/ : cible mode local\nnatif, point de decision isLocalMode/getSession/hasCloudToken, carte des fichiers,\ncommandes, process de release desktop-v*, journal des correctifs de la session,\net les pieges deja rencontres (trousseau ve\n[…]\nfil claude stream-json, reaping des process, GPU). Pour reprendre le\ndev/debug sur une autre machine sans re-decouvrir le terrain.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(app): CLAUDE.md de reprise (mode local natif, journal 1.2.5-1.2.…",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-24T09:12:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b287d8fde197a87e9d46d9c5e89bc8a9c5b19153",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: changelog — coherence mode UI/donnee (desktop-v1.2.12)",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-23T13:09:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d85fcd239ba94a4ff82e5b3a00b9d67f1cdb2ed3",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(app): bump 1.2.12 (UI/donnee mode coherents)",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-23T13:09:42Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "755c9dcab4fb15db61c1d696cbd9ee4671bb101b",
          "body": "…nnee)\n\ngetSession() (lu par l'UI) renvoyait null quand aucun mode n'etait persiste ->\nla barre affichait Cloud alors que isLocalMode() (la donnee) defautait sur local\n(1.2.11). Les deux divergeaient. Regle partagee hasCloudToken() : sans mode\nexplicite ET sans token cloud, les deux renvoient local ; un token garde la\npriorite cloud ; un mode explicite est respecte. Table de verite testee.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(app): getSession et isLocalMode partagent le meme defaut (UI = do…",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-23T13:09:40Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "32e83db0d4e9e138e02c7e429804c0f1b7be808f",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: changelog — defaut mode local (desktop-v1.2.11)",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-23T13:01:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d1827e4f9b50600c9d6e8a6acdfe86ad948f3a0b",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(app): bump 1.2.11 (defaut mode local sans token)",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-23T13:01:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "00151a31bba86318b560a0688c61d3aa385ba9f6",
          "body": "… cloud\n\nCause de l'AUTH_REQUIRED sur toutes les pages en local : le code est deja\nmode-aware (N1) mais isLocalMode() renvoyait false quand aucun mode n'etait\npersiste -> l'app tentait le cloud et echouait partout (le mode 'local' ne se\npersistait pas avant le repli du store). isLocalMode() defaute \n[…]\nas de token cloud ; un token present donne la priorite\nau cloud ; un mode explicite est respecte. Table de verite complete testee.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(app): defaut mode local quand aucun mode persiste et pas de token…",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-23T13:01:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a2a9e2db9d70f09a49786d943294340ca5f9e8e8",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: changelog — gpu test POSIX-only (desktop-v1.2.10)",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-23T12:28:20Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "07f42aba746d9d4a961821ac8b4a22bca618a62d",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(app): bump 1.2.10 (build Windows repare)",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-23T12:28:18Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "01eb2655bf12371fc1269a506d473b2b76b4f937",
          "body": "…reconstruit)\n\nMeme correctif que resolve-bin : les fixtures a chemins POSIX cassaient sur le\nrunner Windows. describe.skipIf(win32).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(app): gpuMarkerPath tests POSIX-only (jambe Windows verte, .exe …",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-23T12:28:17Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ecb3da5aca67b62b40b524237c5bf03e359d5af7",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: changelog — store/GPU/orphelins Desktop (desktop-v1.2.9)",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-23T12:14:16Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "91ea054021dc2895935458c576025f4e7f7794df",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(app): bump 1.2.9 (store fallback, GPU opt-out, orphan reaping)",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-23T12:14:15Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "92f00d7f7a986f57698f460d441a48a3554424ca",
          "body": "… at quit\n\nTrois defauts de terrain, durcis par un audit adversarial :\n- secure-store : keytar echouant a l'appel (trousseau Linux verrouille ->\n  'Password is required') se replie desormais sur le .env au RUNTIME, pas\n  seulement si le module est absent. La persistance (token, mode, dossier\n  proje\n[…]\nstore + persistance dossier, decision GPU, kill de groupe (POSIX)\n+ reaping registre MCP. App 587 verte, typecheck + lint propres.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(app): store runtime fallback, GPU opt-out, orphan-process reaping…",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-23T12:14:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e7f9ed0c5cd1a6a3a6190f91ccca5a1b405ff579",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: changelog — chat local persistant a la navigation (desktop-v1.2.8)",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-23T10:12:33Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0c645454146f83a95245b36b107de14776cda0ad",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(app): bump 1.2.8 (chat local persistant)",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-23T10:12:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1e88509bed0ec7b67890eeeabb8d47d636220ad8",
          "body": "L'etat de useLocalChat est remonte dans un LocalChatProvider monte une fois dans\nApp() au-dessus du routeur manuel : naviguer demonte LocalChatView mais le thread\n+ sessionId + abonnement + flux en direct survivent. Le process claude du\nprocessus principal survivait deja ; seul le rendu oubliait.\n\nA\n[…]\nre-export (chemin stable). Tests : persistance\nremontage, flux hors-page, reset deconnexion, stop ancienne session. App 573 verte.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(app): chat local persistant a la navigation (LocalChatProvider)",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-23T10:12:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "60fff1e32aed54c01ab1954ebb7a631bd8b47aea",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: changelog — build Windows repare (desktop-v1.2.7)",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-23T09:10:24Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "56be9fc8940473a8bcb1a28d5c44282f8c4fb543",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(app): bump 1.2.7 (build Windows repare)",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-23T09:10:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "eacda58478f2709c12b23d1257ab3c795a4c273f",
          "body": "…construit)\n\nLes 4 tests a fixtures POSIX (/home/..., separateur :) echouaient sur le runner\nWindows, faisant echouer 'Run tests' AVANT 'Package Windows' -> pas de .exe\ndepuis desktop-v1.2.4. Le module resolve-bin est deja multi-plateforme\n(path.join/delimiter) ; seules les fixtures sont POSIX. describe.skipIf(win32).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(app): resolve-bin tests POSIX-only (jambe Windows verte, .exe re…",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-23T09:10:21Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3da80a5746ce99febe397a080b081bd557616c88",
          "body": "…-v1.2.6)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: changelog — durcissement chemin chat local stream-json (desktop…",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-23T08:56:11Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "29c9b11a23cb8caa7635da01d70e9105a156bdfb",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(app): bump 1.2.6 (chat local prod-stable)",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-23T08:56:09Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e1d3c72d2c750cb8b5784b1572de64bc56dbdc13",
          "body": "…audit\n\nSecond defaut fatal apres --verbose : le message stdin n'avait pas le wrapper\nmessage.role (\"Expected message role 'user', got 'undefined'\"). Audit adversarial\n(workflow natif 32 agents) sur tout le chemin du chat : 28 defauts bruts, 20\nconfirmes, 18 corriges, 2 differes avec raison. Prouve \n[…]\nerveur, repli renderer + test d'integration opt-in (BYAN_E2E_CLAUDE=1).\nSuite app 568 + webui 75 vertes, typecheck + lint propres.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: chat local prod-stable — forme stdin stream-json + 17 defauts d'…",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-23T08:56:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4b443ddced6a6f9932593410e1412c0dab611585",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: changelog — fix chat local --verbose (desktop-v1.2.5)",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-23T08:10:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "72e0ad1b76c974ef4db4960b8434386b710977b0",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(app): bump 1.2.5 (fix chat --verbose)",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-23T08:08:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "65c75945e996aa2029fde6f4e9ca07405270a885",
          "body": "… stream-json\n\nLes deux adaptateurs (app Electron local-chat.ts, webui claude-adapter.js)\nlancaient `claude --print --output-format stream-json` sans --verbose. Le\nCLI refuse la combinaison (\"When using --print, --output-format=stream-json\nrequires --verbose\") et le chat plantait au spawn. Ajoute --verbose dans les\ndeux, met a jour les tests (assertion des args + test dedie).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: chat local + webui — --verbose obligatoire avec claude --print +…",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-23T08:08:19Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "778b1819e8180a378e65df5bd54c834041d7b96b",
          "body": "…is projet)\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(app): bump 1.2.4 (PATH GUI: claude/terminal resolus + chat depu…",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-22T17:15:14Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a5b8eedaf679e7357c914275995ff916b978a5c4",
          "body": "La page detail d'un projet n'exposait que 'Ouvrir le dossier'. Ajout de deux\nboutons quand le projet a un dossier local : 'Lancer une session' (stocke\nchat.pendingCwd puis navigue vers le Chat, qui ouvre claude dans ce dossier)\net 'Terminal' (ouvre claude dans un terminal externe sur ce dossier).\nLocalChatView consomme chat.pendingCwd en priorite sur le dossier onboarding,\npuis l'efface. Navigation cablee App -> Projects -> ProjectDetail.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(app): lancer un chat ou un terminal depuis la page projet (D-03)",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-22T17:15:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "24729c0693c115ab4827a804ff7a0ebf9ac5f9ef",
          "body": "Cause racine terrain 'spawn claude ENOENT' + terminal qui ne s'ouvre pas :\nune app lancee au double-clic herite d'un PATH minimal (pas de ~/.local/bin,\npas de nvm/fnm, pas de fish_add_path). Nouveau module resolve-bin :\n- loginShellPath : demande son PATH au shell de connexion INTERACTIF (-ilc pour\n\n[…]\nateur et lance le claude absolu sur le PATH reel (D-02), env-detect\nsonde avec le PATH reel (D-05). Prouve : avec PATH=/usr/bin, claude resolu.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(app): resout claude/terminal dans l'app packagee (PATH GUI tronque)",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-22T17:15:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b73672b6e6ebeb46dc48495a1bac55fbc24e5185",
          "body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(app): bump 1.2.3 (install packagee : fs-extra + rtk)",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-22T16:43:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "989f45cf94bc69e310c24dfcfaf6446bed063286",
          "body": "Deux causes racines du chemin d'install packagee, confirmees sur la sortie\nelectron-builder reelle :\n- fs-extra introuvable : Electron packagee n'honore PAS Module.globalPaths\n  (NODE_PATH) pour un require bare venant d'install-engine.js (hors asar).\n  NODE_PATH+_initPaths resout sous Node pur mais \n[…]\nt absent\n  et bloquait l'install jusqu'au timeout spawnSync de 5 min. Installer un CLI\n  Rust global n'est pas le role du bouton 'New project'.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(app): l'install 'New project' aboutit dans le binaire package",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-22T16:43:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "61d8201a94f7f8436c8b43665250fbf026d57b9f",
          "body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(app): bump 1.2.2 (fix EPIPE auto-updater)",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-22T16:26:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "51566058de0865b788ecefaa997b9f9bf938ef3b",
          "body": "Au double-clic (sans terminal) stdout pointe vers un tuyau ferme : la\npremiere ecriture console leve EPIPE, relancee en exception non capturee.\nelectron-updater ecrit a chaque verification (+ minuterie), d'ou la boucle\nqui saturait le CPU. Correctif racine :\n- boot-guards: garde stdout/stderr (cas a\n[…]\nctement la stack observee), les vraies\n  erreurs remontent inchangees.\n- auto-updater: logger electron-updater coupe a la source (logger=null).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(app): l'auto-updater ne gele plus le PC (EPIPE en boucle)",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-22T16:26:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "da6bd98b02c806f3a26aa7886f3bc8c460d81ad6",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(app): bump 1.2.1 (fix terrain install-engine deps + cwd local)",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-22T16:07:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "26b936c276eeb6a7391e4b9bd91d14cbd91c7548",
          "body": "… projet existant enregistre\n\nRetour terrain 1.2.0 (3 bugs) :\n- 'Cannot find module fs-extra' : install-engine ships hors asar (resources/\n  install/lib) ; ses deps bare (fs-extra, js-yaml, chalk, byan-platform-config,\n  toutes deps de l'app) ne resolvaient pas. Fix : NODE_PATH += app.asar.unpacked/\n[…]\narait dans Projets, devient cwd).\n\neslint 0, typecheck propre, 534 pass. Fix packaging (fs-extra) verifiable seulement\nsur le binaire empaquete.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(app): mode local - install-engine deps resolvables, cwd de repli,…",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-22T16:07:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e2f49d985ccf0c11e28afd7a5a44e4eb0dd38948",
          "body": "…, claude local+MCP)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(app): bump 1.2.0 (mode local natif N1..N3 : zero token, install…",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-22T15:46:11Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d8a0fb88a8edc160433a59771b71070b72b56c56",
          "body": "…ocal\n\nRemplace le chat web-clone (F2/F3, WebSocket vers le serveur webui forke) par un\nspawn NATIF du claude local dans le dossier du projet. claude charge le serveur\nMCP byan depuis le .mcp.json du projet (pose par N2) : canal MCP local, zero\nserveur au milieu, zero cloud, zero token. Meme eveneme\n[…]\ntop, exit-cleanup) ; csp test inverse.\n\nCorrige apres review (Quinn HIGH resume + compliance CSP/doc/cap). eslint 0,\ntypecheck propre, 534 pass.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(app): N3 session locale native - claude local + MCP branche en l…",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-22T15:45:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "84fa817dab8d731057c904944f5260ebef900341",
          "body": "- install-project.ts : pilote l'installeur local (install/lib/install-engine\n  runInstall) charge via createRequire (chemin resolu packaged/dev, eslint-clean).\n  Progression streamee (byan:install:progress). Creer == mettre a jour (overwrite).\n  Garde frontiere de confiance : projectRoot doit etre a\n[…]\nier) + hook\n  (annulation, install complet + record + onDone, erreur). eslint 0, 534 pass.\n\nCorrige apres review compliance (garde projectRoot).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(app): N2 installer/mettre a jour BYAN dans un dossier choisi",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-22T15:27:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "063b41985d86c6481b9e3c46316b8e984bbe0bc6",
          "body": "…oken\n\nCorrige le bug racine (capture 'No auth token' en local) : les 8 pages tapaient\ntoutes le cloud byanWeb et exigeaient un token, meme en local.\n\n- main/local-data.ts : fournisseur local qui lit le disque (registre\n  ~/.byan/projects.json + arbre _byan/ du projet : agent/, connaissance/,\n  memo\n[…]\n isLocalMode (4 cas).\n  eslint 0, typecheck propre, suite 527 pass.\n\nCible corrigee (option A validee) : local natif, pas un clone web du cloud.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(app): N1 mode local natif - source de donnees sur disque, zero t…",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-22T15:12:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "20d779a1425793f88abd187177bf32d05efe6fb7",
          "body": "…rt ws sans require\n\n- 6 fichiers de test : retire 'import React' inutile (transform react-jsx)\n- local-chat.ts : import WebSocket depuis 'ws' (+ types ws.d.ts) au lieu de\n  require() (regle @typescript-eslint/no-require-imports)\n- eslint 0 erreur, typecheck propre, suite app 517 pass\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(app): lint CI vert - retire imports React inutiles (tests) + impo…",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-22T14:36:01Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4268e38d0c748098822ddb29936a292aeedafb7c",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(app): bump version 1.1.0 (features runtime mode local F1..F7)",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-22T14:19:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "01797448e4247c06be07b4686caf52712ba2b0b7",
          "body": "…nal, dossier projet (F1..F7)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: CHANGELOG app Desktop - mode local, chat local, sessions, termi…",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-22T13:55:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d22e707238b73103d5592d746682b663aa8d0ab5",
          "body": "…ive)\n\n- remplace le \"Connected to byan_web\" fige par une ligne live et consciente\n  du mode : local -> badge Local (le chat local ne depend pas de byan_web),\n  cloud -> etat reel via useOnlineStatus (connecte / instable / hors ligne)\n- la sonde de connectivite N'INTERROGE PAS byan_web en mode local\n[…]\n le mode\n- connectivity() exporte + teste (local/online/unstable/offline/custom)\n\ntypecheck clean, suite app 517 pass. Clot le backlog (F1..F7).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(app): F7 coherence connecte/hors-ligne (Dashboard mode-aware + l…",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-22T13:53:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9e20ebe0d43e81755a855ad4ef7767719145eae1",
          "body": "….json)\n\n- projects-registry.ts : lecture/ecriture tolerante de ~/.byan/projects.json\n  (module main), match projet->dossier par projectId puis nom/basename\n- projects-local IPC : list/record/find/reveal ; reveal valide un dossier\n  absolu existant avant shell.openPath (garde coherente avec F5)\n- on\n[…]\npar l'installeur CLI\n(install/lib) differee : bloquee par le WIP subscription-status parallele, non\ntouche. typecheck clean, suite app 511 pass.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(app): F6 dossier projet local visible (registre ~/.byan/projects…",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-22T13:46:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8d5a693973634996f88365c2e6d1251f2600a249",
          "body": "- terminal.ts : buildLaunch(platform, cwd, command) pur, par OS\n  (mac osascript, win cmd start, linux gnome/konsole/xfce/xterm) ; detection\n  du terminal Linux sur le PATH ; spawn detache (survit a la fermeture)\n- securite (frontiere de confiance = le handler IPC) : cwd valide (chemin\n  absolu + do\n[…]\non handler (cwd, injection command)\n\nCorrige apres block compliance (injection win32 + validation handler).\ntypecheck clean, suite app 495 pass.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(app): F5 lancer claude dans un terminal externe (multi-OS)",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-22T13:33:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4e3047a4a6dc5bb7b8a0e91cbb71eaa3765ee76f",
          "body": "- LocalChatView : cwd par defaut = dossier onboarding (store), affiche dans\n  l'entete, bouton dossier pour en choisir un autre (fs.openProjectDialog)\n- newSession et l'envoi a la volee lient la session au cwd choisi (undefined\n  -> defaut serveur, jamais {cwd:null})\n- useLocalChat.send accepte des \n[…]\na la volee\n- reutilise la plomberie cwd de F3 (jusqu'au spawn claude)\n- tests : hook (startOpts) + vue (defaut onboarding, selecteur) ; 479 pass\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(app): F4 nouvelle session locale liee a un dossier de projet (cwd)",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-22T10:46:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8dcdcae6880823ebe3ca685c7138f651adb4733f",
          "body": "…d, persist)\n\nMoteur (serveur webui, partage ws + http) :\n- session-manager persiste cwd + claudeSessionId ; setClaudeSessionId ;\n  list() expose cwd + resumable ; garde d'id anti-traversee (_isValidId)\n- claude-adapter : --resume <id> (precedence sur --session-id)\n- server _wsStartChat + api chat/s\n[…]\n_fix\nsecurite) + persistance des reponses assistant (HIGH). Re-verifie: 2 fixes CLOSED.\nTests : webui jest 25, app vitest 477 ; typecheck clean.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: F3 session claude - creer a la volee ou reprendre (--resume, cw…",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-22T10:41:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3ff566771095da89d8ea85dabc0dcfbdb16fad72",
          "body": "- LocalChatBridge (main) : une connexion ws vers le serveur webui forke,\n  corrige le contrat (chat-start/chat-send/chat-stop, pas start-chat),\n  correlation FIFO du start, normalisation des trames -> byan:chat-local:message\n- preload expose byanApi.localChat (start/send/stop) ; le renderer n'ouvre\n\n[…]\nmode local\n- Dashboard : bouton 'New session' (mort) branche vers le chat\n- tests : 10 bridge + 8 hook + 3 vue ; typecheck clean, suite 468 pass\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(app): F2 chat local via le claude local (bridge ws->IPC)",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-22T10:13:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9a950d1433c9f402e87a94bcba1de53e43cdb9d4",
          "body": "…erveur)\n\nG4. L'API byan_web proxifie Google Workspace cote serveur (documents au nom\nde chaque utilisateur), donc l'installation ne configure plus aucun credential\nGoogle en local : le seul geste est BYAN_API_URL + BYAN_API_TOKEN.\n\n- Prompts cle SA Google Docs (gdoc-setup) et extension gdrive OAuth\n[…]\ntants (backup date, 0600) sur\n  les deux chemins ; google-sa.json jamais supprime (message informatif).\n\nVerifie: suite installeur jest 397/397.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(install): reduire le setup au token d'abonnement (proxy Google s…",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-22T09:53:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "14d15a09e7f09f5053649b1aee289e7b8d183bcf",
          "body": "- ModeSwitcher : chip + menu dans la StatusStrip, atteignable partout,\n  bascule local<->cloud en un clic sans re-login ni relaunch\n- switchMode reutilise le token stocke pour cloud/custom (toggle 1 clic)\n- passage a local : demarre le serveur local si besoin avant de basculer\n- StatusStrip consomme\n[…]\nwitchMode (fallback token / invalid_token), 8 cas\n  ModeSwitcher, e2e switch-mode reecrit sur le vrai switcher\n- typecheck clean, suite 448 pass\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(app): F1 bascule mode live depuis la barre de statut (ModeSwitcher)",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-22T09:51:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5778bf1225f5f00737de0bcf00c375ccd596356b",
          "body": "… session, StatusStrip live\n\nBug racine : login n'ecrivait que auth.token, jamais auth.url/auth.mode ->\nbyan-api-client getBase() retombait toujours sur le cloud, le mode local ne\nmarchait pas. Corrige :\n\n- auth.ts : login persiste auth.mode + auth.url (branches local ET cloud/custom),\n  logout les \n[…]\nfiche le vrai mode (Local/Cloud) live\n- tests auth 27/27 ; suite app 438/438\n\nReste pour F1 : bouton de bascule dans la barre (socle IPC pret).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(app): F1 socle mode local/cloud - persiste mode+url, contexte de…",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-22T09:36:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "59c283403825f66b9f7d2b4b51a9073b9ce2d37f",
          "body": "Cause du 'j'ai pas l'AppImage sur GitHub' : la release etait publiee mais en\nprerelease. GitHub exclut les prereleases de 'Latest' -> page depot sans badge,\n/releases/latest en 404. L'AppImage etait la mais invisible.\n\n- prerelease: false + make_latest: 'true' -> badge Latest, /releases/latest OK\n- \n[…]\ntop-v1.0.0 deja en place basculee a la main (verifie :\n  /releases/latest renvoie desktop-v1.0.0, l'AppImage y est)\n- contrat CI aligne (21/21)\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: la release Desktop est marquee Latest (plus prerelease cachee)",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-22T08:59:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6483a261d46ac02588a130c0c4c96ab34974d7c8",
          "body": "…e tests\n\n- download-artifact : pattern byan-* (les installateurs), plus le\n  playwright-report-* -> fini les .zip de rapport/trace a nom de hash colles\n  dans la release\n- globs de fichiers nommes (BYAN-Setup-*.exe, BYAN-*.zip) pour ne pas\n  re-attraper de .zip arbitraire\n- la release desktop-v1.0.0 deja publiee a ete nettoyee a la main (13 assets\n  parasites supprimes) ; ce correctif rend les prochaines propres d'office\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: la release ne ramasse que les installateurs, plus les rapports d…",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-22T08:32:26Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f83eabbb7eb4628170b56931cb90c8a1a3616683",
          "body": "…ge cliquable)\n\nCe que le user veut : telecharger l'AppImage sur GitHub sans npm. La page\nPackages n'heberge que des registres (npm/conteneurs), pas un .AppImage\ncliquable — le bon canal est les Releases. Corrige :\n\n- release : publiee automatiquement (draft:false + prerelease), if:always()\n  -> les\n[…]\n-draft\n  prerelease, AppImage en asset, plus de job packages-ghcr\n\nNote npm : 'cannot publish over 2.59.1' = c'est deja publie, rien a refaire.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: les binaires Desktop se telechargent depuis les Releases (AppIma…",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-22T08:19:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "64158b50c90705644ebba4fe255fbc88f9f9c8e2",
          "body": "…forme, budget e2e Windows\n\n- fixtures e2e : binaire linux renomme byan (executableName pose en bfea574,\n  la fixture cherchait encore byan-app -> 7 echecs Linux) ; branche macOS\n  sonde mac-arm64/mac/mac-universal (l'executeur mac moderne est arm64)\n- menu.test.ts : plateforme epinglee a linux au n\n[…]\nate sur l'execution 29843314230 (tag desktop-v1.0.0, premiere execution\ncomplete de la chaine sur les 3 OS). Local : menu 20/20, app 433 verts.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: la CI desktop passe sur les 3 OS - binaire byan, menus par plate…",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-22T07:54:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9763e00b5db12c91be7dd3813dacbb8196a0522f",
          "body": "…iroir npm)\n\n- job packages-ghcr : les installateurs desktop pousses comme artefact OCI sur\n  ghcr.io/yan-acadenice/byan-desktop:<version> au tag desktop-v* (oras, annotation\n  source pour relier le paquet au depot)\n- npm-ghp-mirror.yml : miroir @yan-acadenice/create-byan-agent sur le registre\n  npm\n[…]\nses restent le canal principal (navigateur + auto-mise-a-jour)\n- contrat CI : 2 nouveaux tests (21/21), permissions packages:write verrouillees\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: les binaires apparaissent sur la page GitHub Packages (ghcr + m…",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-21T15:23:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "16c719bb6fcb908cf9437d7da730871e0a076e06",
          "body": "… routent en exploration/haiku\n\nCas terrain byan_web : un workflow DISCOVERY a etiquete ses scans map:mcp-server,\nmap:connector... Non reconnus par le classifieur, ils sont restes profonds et ont\nherite d'une session Fable 5 (~95k tokens chacun, le modele le plus cher).\n\n- prefixe map: (deux-points,\n[…]\n, inventory, recensement, census,\n  enumerate, survey, crawl\n- tests : 2 nouveaux cas (24/24) ; suite MCP 861/861 ; miroir template synchronise\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: les feuilles de cartographie (map:, cartographie, inventaire...)…",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-21T15:12:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fa9d235fd959cffee1e8953b0dd5240814a12220",
          "body": "…desktop-v* (v2.59.1)\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: app Desktop 1.0.0 construite et prouvee, mode d'emploi release …",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-21T15:09:19Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f874e713598020205e4d885b301066f8b324fb5d",
          "body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: le contrat CI verrouille le tag desktop-v* (v* = versions npm)",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-21T15:08:07Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0096502b507f65e5ad81cdf1c019ec40841dec55",
          "body": "- extraResources livre install/lib (le require ../../lib/install-engine du webui\n  resout dans le paquet ; les modules yanstaller/detector/backup/stt/exchange\n  ne tombent plus silencieusement a null)\n- deps du graphe serveur declarees dans l'app (chalk, fs-extra, inquirer,\n  js-yaml, byan-platform-\n[…]\n\n- re-preuve renforcee : moteur charge depuis le paquet (claude=true codex=true),\n  ready + /health 200 + /api/status 200 avec detection moteur\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: le moteur d'install vit dans l'app empaquetee (verdict compliance)",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-21T15:02:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "89f08f47440806b0b15efa779ee24bba03deb64b",
          "body": "…lision avec les tags npm v*\n\n- declencheur tags: desktop-v* (les v* portent les versions npm 2.x)\n- condition du job release alignee sur refs/tags/desktop-v\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: la release Desktop part sur un tag dedie desktop-v*, plus de col…",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-21T14:52:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bfea574af58d093235dbfb1214381601cfe486c6",
          "body": "…ws corriges (app v1.0.0)\n\n- executableName=byan (deb: /opt/BYAN/byan, les chemins que la detection CLI sonde)\n- extraResources restructures en conservant la structure du depot : les require()\n  relatifs du serveur webui resolvent identiquement une fois empaquete\n- ws ajoute aux deps de l'app + asar\n[…]\n fork du serveur empaquete -> ready port 33181, GET /health 200 ;\n  artefacts BYAN-1.0.0.AppImage (108 Mo) + byan-app_1.0.0_amd64.deb (74,6 Mo)\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: app Desktop empaquetee qui se lance - Linux prouve, chemins et …",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-21T14:51:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "532e7900769bf75f73a883b6e397b2c4a31b3a5e",
          "body": "…ise, mode AUTO conforme (v2.59.0)\n\n- detection plateforme cablee sur le moteur (detectEnvironment: ~/.claude,\n  ~/.codex, binaires) au lieu du detecteur Claude Desktop / dossier projet\n- interface complete en francais (7 etapes + mise a jour + journal)\n- mode AUTO: demande le prenom (plus de 'User'\n[…]\nlateformes detectees\n- decision Electron vs Tauri gravee dans app/README.md (serveur Node -> Electron)\n- tests: webui-detection.test.js (7 cas)\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: assistant web - detection Claude/Codex reparee, interface franca…",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-21T14:08:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1927a5c9fe487b453dab464712f5f61b0d42068e",
          "body": "…t find module ws) (v2.58.2)\n\n- ws etait dans install/package.json (interne, non publie), absent de la racine\n  que npm i -g installe -> require('ws') introuvable -> serveur webui mort au lancement\n- ws ^8.20.0 ajoute aux dependances racine\n- filet : install/__tests__/shipped-deps.test.js exige que tout require externe du\n  code expedie soit une dep racine (ou natif Node) ; attrape la derive a l'avenir\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: declare ws dans les deps racine, l'assistant web plantait (Canno…",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-21T13:46:14Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "dfc709989dff25ffaee443839455ae52a4156851",
          "body": "…s de skills (v2.58.1)\n\n- cause : question inquirer posee sous un indicateur ora actif -> prompt invisible, gel\n- l'install auto n'ouvre plus de question interactive : signalement + commande par defaut,\n  sans ecriture dans ~/.claude ni blocage\n- drapeau --sync-skills : synchronise sans demander (consentement = le drapeau)\n- fonction pure skillsSyncConsent + tests ; non-blocage prouve sur maquette de divergence\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: l'install auto en terminal gelait au controle des copies globale…",
          "author_name": "Yan_Acadenice",
          "author_login": "Yan-Acadenice",
          "committed_at": "2026-07-21T13:38:39Z",
          "body_truncated": false,
          "is_coding_agent": true
        }
      ],
      "releases_count": 15,
      "commits_last_year": 673,
      "latest_release_at": "2026-07-23T13:19:08Z",
      "latest_release_tag": "desktop-v1.2.12",
      "releases_from_tags": false,
      "days_since_last_push": 1,
      "active_weeks_last_year": 21,
      "days_since_latest_release": 6,
      "mean_days_between_releases": 0.1
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "create-byan-agent",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "byan",
            "ai",
            "multi-agent",
            "workflow",
            "agent-builder",
            "bmad",
            "merise-agile",
            "tdd",
            "voice-dictation",
            "whisper",
            "turbo-whisper"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/create-byan-agent",
          "is_deprecated": false,
          "latest_version": "2.59.1",
          "repository_url": "https://github.com/Yan-Acadenice/BYAN",
          "versions_count": 111,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 4977,
          "first_published_at": "2026-02-02T14:40:15Z",
          "latest_published_at": "2026-07-21T15:17:43.984000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 8
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 8,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": null,
      "open_issues_and_prs": 1
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": true,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [],
      "largest_source_bytes": 97498,
      "source_files_sampled": 982,
      "oversized_source_files": 4,
      "agent_instruction_files": [
        ".claude/CLAUDE.md",
        "AGENTS.md",
        "CLAUDE.md",
        "_byan/agent/claude/claude.md",
        "app/CLAUDE.md",
        "install/templates/.claude/CLAUDE.md",
        "install/templates/_byan/agent/claude/claude.md"
      ],
      "agent_instruction_max_bytes": 17434
    },
    "dependencies": {
      "manifests": [
        "api/package.json",
        "app/package.json",
        "install/package.json",
        "package.json",
        "update-byan-agent/package.json"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [
        {
          "name": "@github/copilot-sdk",
          "manifest": "api/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.2.2"
        },
        {
          "name": "better-sqlite3",
          "manifest": "api/package.json",
          "ecosystem": "npm",
          "version_constraint": "^11.0.0"
        },
        {
          "name": "jsonwebtoken",
          "manifest": "api/package.json",
          "ecosystem": "npm",
          "version_constraint": "^9.0.0"
        },
        {
          "name": "@fontsource/inter",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.3.0"
        },
        {
          "name": "@fontsource/jetbrains-mono",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.3.0"
        },
        {
          "name": "@fontsource/josefin-sans",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.3.0"
        },
        {
          "name": "byan-platform-config",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "file:../install/packages/platform-config"
        },
        {
          "name": "chalk",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.1.2"
        },
        {
          "name": "electron-updater",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.8.3"
        },
        {
          "name": "fs-extra",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^11.3.6"
        },
        {
          "name": "inquirer",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^8.2.7"
        },
        {
          "name": "js-yaml",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.3.0"
        },
        {
          "name": "keytar",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.9.0"
        },
        {
          "name": "lucide-react",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.14.0"
        },
        {
          "name": "react",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^18.3.1"
        },
        {
          "name": "react-dom",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^18.3.1"
        },
        {
          "name": "react-markdown",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^10.1.0"
        },
        {
          "name": "remark-gfm",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.0.1"
        },
        {
          "name": "ws",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^8.21.1"
        },
        {
          "name": "byan-platform-config",
          "manifest": "install/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.0.0"
        },
        {
          "name": "chalk",
          "manifest": "install/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.1.2"
        },
        {
          "name": "commander",
          "manifest": "install/package.json",
          "ecosystem": "npm",
          "version_constraint": "^11.1.0"
        },
        {
          "name": "fs-extra",
          "manifest": "install/package.json",
          "ecosystem": "npm",
          "version_constraint": "^11.2.0"
        },
        {
          "name": "inquirer",
          "manifest": "install/package.json",
          "ecosystem": "npm",
          "version_constraint": "^8.2.5"
        },
        {
          "name": "js-yaml",
          "manifest": "install/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.1.0"
        },
        {
          "name": "ora",
          "manifest": "install/package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.4.1"
        },
        {
          "name": "ws",
          "manifest": "install/package.json",
          "ecosystem": "npm",
          "version_constraint": "^8.20.0"
        },
        {
          "name": "@anthropic-ai/claude-code",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.1.114"
        },
        {
          "name": "@modelcontextprotocol/sdk",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.29.0"
        },
        {
          "name": "better-sqlite3",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^12.9.0"
        },
        {
          "name": "byan-platform-config",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "file:./install/packages/platform-config"
        },
        {
          "name": "chalk",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.1.2"
        },
        {
          "name": "commander",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^11.1.0"
        },
        {
          "name": "fs-extra",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^11.2.0"
        },
        {
          "name": "inquirer",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^8.2.5"
        },
        {
          "name": "js-yaml",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.1.0"
        },
        {
          "name": "ora",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.4.1"
        },
        {
          "name": "uuid",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^13.0.0"
        },
        {
          "name": "winston",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.19.0"
        },
        {
          "name": "ws",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^8.20.0"
        },
        {
          "name": "byan-platform-config",
          "manifest": "update-byan-agent/package.json",
          "ecosystem": "npm",
          "version_constraint": "file:../install/packages/platform-config"
        },
        {
          "name": "chalk",
          "manifest": "update-byan-agent/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.1.2"
        },
        {
          "name": "commander",
          "manifest": "update-byan-agent/package.json",
          "ecosystem": "npm",
          "version_constraint": "^11.1.0"
        },
        {
          "name": "diff",
          "manifest": "update-byan-agent/package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.1.0"
        },
        {
          "name": "fs-extra",
          "manifest": "update-byan-agent/package.json",
          "ecosystem": "npm",
          "version_constraint": "^11.2.0"
        },
        {
          "name": "inquirer",
          "manifest": "update-byan-agent/package.json",
          "ecosystem": "npm",
          "version_constraint": "^8.2.5"
        },
        {
          "name": "js-yaml",
          "manifest": "update-byan-agent/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.1.0"
        },
        {
          "name": "ora",
          "manifest": "update-byan-agent/package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.4.1"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 1,
        "merged_prs": 0,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "Yan-Acadenice",
          "commits": 673,
          "avatar_url": "https://avatars.githubusercontent.com/u/110977877?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "electron-build.yml",
        "fact-check-audit.yml",
        "yanstaller-test.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        ".eslintrc.js",
        "eslint.config.mjs"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "package-lock.json"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": null,
            "reason": "no pull request found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 4,
            "reason": "dependency not pinned by hash detected -- score normalized to 4",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "no SAST tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "73 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "594e9be089fb4e67cdd024550baf1ab74573a74e",
        "ran_at": "2026-07-30T03:34:38Z",
        "aggregate_score": 3.1,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-28T15:49:57Z",
      "oldest_open_prs": [
        {
          "number": 1,
          "created_at": "2026-02-03T18:13:13Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": null,
      "ci_last_conclusion": "FAILURE",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/Yan-Acadenice/BYAN",
    "host": "github.com",
    "name": "BYAN",
    "owner": "Yan-Acadenice"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 54,
      "inputs": {
        "security": 31,
        "vitality": 83,
        "community": 39,
        "governance": 34,
        "engineering": 78
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 83,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 78,
            "inputs": {
              "commits_last_year": 673,
              "human_commit_share": 1,
              "days_since_last_push": 1,
              "active_weeks_last_year": 21
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 1 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 1
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "21/52 weeks with commits",
                "points": 14.5,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 21
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "673 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 673
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 15,
              "latest_release_tag": "desktop-v1.2.12",
              "releases_from_tags": false,
              "days_since_latest_release": 6,
              "mean_days_between_releases": 0.1
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "15 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 15
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 6 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~0.1 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 0.1
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 39,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 14,
            "inputs": {
              "forks": 0,
              "stars": 8,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "8 stars",
                "points": 13.7,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 8
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 62,
            "inputs": {
              "packages": [
                "create-byan-agent"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 4977
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "4,977 downloads/month across npm",
                "points": 49.3,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 4977,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "at_risk",
        "name": "Sustainability & Governance",
        "value": 34,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 13,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "critical",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution, PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution",
                    "pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 1,
            "inputs": {
              "merged_prs": 0,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "no decided pull requests or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_decided_prs_or_data",
                    "params": {}
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 41,
            "inputs": {
              "followers": 5,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "Yan-Acadenice",
              "public_repos": 18,
              "account_age_days": 1449
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "5 followers of Yan-Acadenice",
                "points": 5.6,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 5,
                      "login": "Yan-Acadenice"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "18 public repos, account ~3 yr old",
                "points": 17.2,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 18
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 3
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "create-byan-agent"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 8
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 8 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 8
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "111 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 111
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 78,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 80,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "3 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": ".eslintrc.js, eslint.config.mjs",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".eslintrc.js, eslint.config.mjs"
                    }
                  }
                ],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "good",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 75,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 31,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Packaging. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "packaging"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 31,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 3.1
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 4",
                "points": 2,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "no SAST tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "73 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 2
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 66,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 1,
              "agent_instruction_files": [
                ".claude/CLAUDE.md",
                "AGENTS.md",
                "CLAUDE.md",
                "_byan/agent/claude/claude.md",
                "app/CLAUDE.md",
                "install/templates/.claude/CLAUDE.md",
                "install/templates/_byan/agent/claude/claude.md"
              ],
              "agent_instruction_max_bytes": 17434
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": ".claude/CLAUDE.md, AGENTS.md, CLAUDE.md, _byan/agent/claude/claude.md, app/CLAUDE.md, install/templates/.claude/CLAUDE.md, install/templates/_byan/agent/claude/claude.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".claude/CLAUDE.md, AGENTS.md, CLAUDE.md, _byan/agent/claude/claude.md, app/CLAUDE.md, install/templates/.claude/CLAUDE.md, install/templates/_byan/agent/claude/claude.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "100 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 100,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 57,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "package-lock.json"
              ],
              "has_dockerfile": true,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [],
              "agent_commit_share": 1,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": ".eslintrc.js, eslint.config.mjs",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".eslintrc.js, eslint.config.mjs"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "Dockerfile, lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Dockerfile, lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "100 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 100,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 4",
                "points": 4,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "moderate",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "primary_language": "JavaScript",
              "largest_source_bytes": 97498,
              "source_files_sampled": 982,
              "oversized_source_files": 4
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "JavaScript without a type-check config",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_typecheck_config_language",
                    "params": {
                      "language": "JavaScript"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "4/982 source files over 60KB",
                "points": 54.8,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 982,
                      "oversized": 4
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "moderate",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 60,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": true,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "Could not fetch npm package 'update-byan-agent' from its registry",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-30T03:34:43.801297Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/y/Yan-Acadenice/BYAN.svg",
  "full_name": "Yan-Acadenice/BYAN",
  "license_state": "standard",
  "license_spdx": "MIT"
}

Оцінки — це сигнали, а не гарантії. Вони відображають публічно видимі практики на GitHub — це не аудит коду й не гарантія безпеки.

Відсутні дані виключаються, а ваги перенормовуються — нуль за відсутність ніколи не ставиться. Методологія версіонована й відкрита: метрики v1.13.0, схема v0.27.0 — повна методологія · вікі метрик.

Як окремий результат виглядає на тлі всього реєстру: сукупна статистикаnpm.