公开记录
软件健康报告模式 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年2月在 GitHub 上查看 ↗

Yan-Acadenice/BYAN 的健康指数为 100 分中的 54 分,处于「中等」区间。 其得分最高的类别是Vitality(83/100),最低的是Security(31/100)。 最近一次更新在 1 天前。 近期的大部分工作由 1 位贡献者完成。

54
总分 / 100
中等

软件健康指数

指标归入加权类别,统一采用 1–100 量表。总体分先取类别加权平均;当公开证据触发高风险司法辖区政策时,评级会按政策调整,并设置 49(有风险)的上限。AI 就绪度不计入总体分。

54
优秀85-100堪称典范;基本满足所有检验标准
良好70-84健康;仅有轻微不足
中等50-69可接受,但存在明显不足;建议进行审查
存在风险30-49存在重大薄弱环节;采用时应保持审慎
危急1-29问题严重(项目被弃置、仅有单一维护者、缺乏基本工程规范)
活力社区与采用可持续性与治理工程质量安全AI 就绪度

评分画像

每条轴代表一个类别。形状比平均值更重要——健康的对象会填满整个图形,而“一峰一谷”式画像意味着某一维度的优势正掩盖另一维度的风险。

所有权

Yan Bourquard-Ania个人账户
5 关注者18 个公开仓库始于 2022年8月Acadenice

该仓库由个人账户拥有。相较于组织支持的项目,单一所有者项目的延续性风险更高。

软件包生态系统

注册表软件包版本月下载量版本数最近发布标签
npmcreate-byan-agent2.59.14,9771118 天前byanaimulti-agentworkflowagent-builderbmadmerise-agiletddvoice-dictationwhisperturbo-whisper

按类别列示的指标

活力

项目是否仍有生命——是否仍在编写代码,是否仍在发布版本?

83良好 · 占总体的 22%
评分方式
36/36推送新近度 — 最近一次推送于 1 天前
14.5/36提交节奏 — 52 周中有 21 周有提交
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

发布纪律

90优秀
评分方式
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

社区健康

50中等
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(MIT)
0/18CONTRIBUTING 指南
0/13.5行为准则
0/7.2议题模板
0/6.3PR 模板
所用输入
has_readme
has_license
has_contributing
has_issue_template
has_code_of_conduct
has_pull_request_template
评分方式
49.3/80月度下载量 — npm 合计每月 4,977 次下载
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议题解决 — 没有议题或无数据
0/38.3PR 接受 — 没有已裁定的拉取请求或无数据
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
已排除计分(无数据或不适用):议题解决, PR 接受。 其余权重已重新归一化。
评分方式
10/30所有权背书 — 个人(用户)账户
0/20已验证域名 — 不适用于个人账户
5.6/25所有者影响力 — Yan-Acadenice 有 5 位关注者
17.2/25既往记录 — 18 个公开仓库,账户约 3 年
所用输入
followers5
owner_typeUser
is_verified
owner_loginYan-Acadenice
public_repos18
account_age_days1,449
已排除计分(无数据或不适用):已验证域名。 其余权重已重新归一化。
评分方式
25/25已发布且可解析 — npm 上有 1 个软件包
35/35发布时效 — 最近一次发布于 8 天前
20/20版本历史 — 111 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagescreate-byan-agent
ecosystemsnpm
any_deprecated
min_days_since_publish8

工程质量

基础的工程与文档实践是否到位?

78良好 · 占总体的 20%

工程实践

80良好
评分方式
24/24CI 工作流 — 3 个工作流
24/24存在测试
16/16Linter 配置 — .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。 其余权重已重新归一化。

文档

75良好
评分方式
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。 其余权重已重新归一化。

AI 就绪度

该仓库在多大程度上具备与 AI 编码代理协同开发与维护的条件?这是一枚独立的实验性徽章——权重为 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/11Lint / 格式化配置 — .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可控的文件大小 — 采样的 982 个源文件中有 4 个超过 60KB
所用输入
primary_languageJavaScript
largest_source_bytes97,498
source_files_sampled982
oversized_source_files4
评分方式
0/40API 模式(OpenAPI/GraphQL/proto)
20/20MCP 服务器
40/40可运行示例 — examples
所用输入
example_dirsexamples
has_mcp_signal
api_schema_files

关键数据

8GitHub 星标
1贡献者
673最近 12 个月提交数
1距最近推送天数
15发布版本数
1巴士系数(bus factor)
0开放议题
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.