公开记录
软件健康报告模式 0.27.0 · 指标 2.3.1 · 2026-08-01 03:26 UTC

vibefoundry / vibefoundry-python-lib

VibeFoundry IDE engine — the standalone Python library (local data-science IDE: file management, script runner, data preview, metadata digests).

JavaScript · Python · CSS未检测到许可证★ 0 星标⑂ 0 复刻始于 2026年7月在 GitHub 上查看 ↗
类型网络服务网页界面如何判定

vibefoundry/vibefoundry-python-lib 的健康指数为 100 分中的 22 分,处于「存在风险」区间。 其得分最高的类别是AI Readiness(57/100),最低的是Security(10/100)。 最近一次更新在今天。 近期的大部分工作由 1 位贡献者完成。

22
总分 / 100
存在风险

软件健康指数

指标归入加权类别,统一采用 1–100 量表。总体分先取类别加权平均,再依据公开记录的分布进行校准,使各等级具有百分位含义;当公开证据触发高风险司法辖区政策时,评级会按政策调整,并设置 34(存在风险)的上限。

22
卓越93-100公开记录中的最高层级(约前 5%);基本满足所有检验标准
优秀80-92各方面均表现强劲;仅有少量不足
良好65-79健康;不足之处有限且可控
中等50-64可接受,但存在明显不足;建议进行审查
薄弱35-49多个领域存在实质性薄弱环节
存在风险20-34存在重大薄弱环节;采用时应保持审慎
危急1-19问题严重(项目被弃置、仅有单一维护者、缺乏基本工程规范)
活力社区与采用可持续性与治理工程质量安全AI 就绪度

评分画像

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

加权总体分 28 经校准后在公布的指数量表上为 22(记录校准 2026-08-02)。

所有权

vibefoundry个人账户
1 关注者12 个公开仓库始于 2025年6月

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

软件包生态系统

注册表软件包版本月下载量版本数最近发布标签
PyPIvibefoundry0.4.25,4222530 天前idedata-sciencescriptscodespace

按类别列示的指标

活力

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

39薄弱 · 占总体的 21%
评分方式
36/36推送新近度 — 最近一次推送于 0 天前
9.7/36提交节奏 — 52 周中有 14 周有提交
18/18提交量 — 最近一年 211 次提交
0/10OpenSSF Scorecard:Maintained — project was created within the last 90 days. Please review its contents carefully
所用输入
commits_last_year211
human_commit_share1
days_since_last_push0
active_weeks_last_year14
评分方式
0/27有发布版本 — 未发布任何发布版本
0/36发布时效 — 没有发布版本
0/27发布节奏 — 没有发布版本
0/10OpenSSF Scorecard:Signed-Releases — 无数据
所用输入
releases_count0
已排除计分(无数据或不适用):OpenSSF Scorecard:Signed-Releases。 其余权重已重新归一化。

社区与采用

项目是否拥有用户、下载量与关注度,并具备欢迎贡献者参与的配置?

25存在风险 · 占总体的 17%
评分方式
0/60星标 — 0 个星标
0/25复刻 — 0 个复刻
0/15关注者 — 0 位关注者
所用输入
forks0
stars0
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

社区健康

25存在风险
评分方式
22.5/22.5README
0/22.5许可证 — 未检测到许可证文件
0/18CONTRIBUTING 指南
0/13.5行为准则
0/7.2议题模板
0/6.3PR 模板
所用输入
has_readme
has_license
readme_badges
has_contributing
has_issue_template
has_code_of_conduct
readme_badge_services
has_pull_request_template
评分方式
49.8/80月度下载量 — pypi 合计每月 5,422 次下载
0/20注册表被依赖数 — 该生态系统不报告此项
所用输入
packagesvibefoundry
dependents
ecosystemspypi
total_downloads
monthly_downloads5,422
已排除计分(无数据或不适用):注册表被依赖数。 其余权重已重新归一化。

可持续性与治理

项目能否在其成员之外延续——巴士系数、响应能力、由谁支持,以及软件包的维护状况?

33存在风险 · 占总体的 23%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
8.1/22.5提交分布 — 头号贡献者编写了 64% 的提交
2.7/13.5贡献者广度 — 2 位贡献者
0/10OpenSSF Scorecard:Contributors — project has 0 contributing companies or organizations -- score normalized to 0
所用输入
bus_factor1
contributors_sampled2
top_contributor_share0.639
评分方式
0/42议题解决 — 没有议题或无数据
0/30PR 接受 — 没有已裁定的拉取请求或无数据
0/13Newcomer PR acceptance — 30 天内没有首次贡献者的 PR 得到裁决
0/15OpenSSF Scorecard:Code-Review — Found 0/30 approved changesets -- score normalized to 0
所用输入
merged_prs0
open_issues0
closed_issues0
prs_merged_7d
prs_decided_7d
prs_merged_30d
prs_decided_30d
issue_closed_ratio
closed_unmerged_prs0
first_time_authors_30d
first_time_prs_merged_30d
first_time_prs_decided_30d
已排除计分(无数据或不适用):议题解决, PR 接受, newcomer_pr_acceptance。 其余权重已重新归一化。
评分方式
10/30所有权背书 — 个人(用户)账户
0/20已验证域名 — 不适用于个人账户
2.2/25所有者影响力 — vibefoundry 有 1 位关注者
10.4/25既往记录 — 12 个公开仓库,账户约 1 年
所用输入
followers1
owner_typeUser
is_verified
owner_loginvibefoundry
public_repos12
account_age_days422
已排除计分(无数据或不适用):已验证域名。 其余权重已重新归一化。
评分方式
25/25已发布且可解析 — pypi 上有 1 个软件包
35/35发布时效 — 最近一次发布于 0 天前
20/20版本历史 — 253 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagesvibefoundry
ecosystemspypi
any_deprecated
min_days_since_publish0

工程质量

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

21存在风险 · 占总体的 19%
评分方式
0/24CI 工作流
0/24存在测试
0/16Linter 配置
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。 其余权重已重新归一化。

文档

50中等
评分方式
30/30README
0/25文档目录
0/15文档 / 主页站点
10/10仓库描述
0/10主题标签
10/10Wiki
所用输入
topics
has_wiki
homepage
has_readme
has_docs_dir
has_description

安全

可见的安全与供应链实践是否稳固,且不存在未解决的高风险司法辖区暴露?

10危急 · 占总体的 16%

安全态势

10危急
评分方式
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/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
0/10Dangerous-Workflow — 无数据
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
0/2.5许可证 — license file not detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
0/5Packaging — 无数据
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — no SAST tool detected
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — 无数据
0/7.5Token-Permissions — 无数据
0/7.5Vulnerabilities — 22 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated13
scorecard_versionv5.5.0
checks_inconclusive5
scorecard_aggregate1
已排除计分(无数据或不适用):ci_tests, dangerous_workflow, packaging, signed_releases, token_permissions。 其余权重已重新归一化。

AI 就绪度

该仓库在多大程度上具备与 AI 编码代理协同开发与维护的条件?权重刻意设小(4%):代理工具链是一项真实的维护信号,但完全不具备的仓库仍可达到 100/100。

57中等 · 占总体的 4%
评分方式
45/45代理指令 — archived md files/AGENTS.md
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 100 次人类提交中有 85 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share0.85
agent_instruction_filesarchived md files/AGENTS.md
agent_instruction_max_bytes75,665
评分方式
18/18一条命令的引导启动 — Makefile
0/22自动化测试
0/11Lint / 格式化配置
0/11静态类型检查
10/10可复现环境 — lockfile
10/10已体现的代理实践 — 最近 100 次提交中有 81 次由代理编写或署名代理
0/8自动化维护 — 未观察到自动依赖更新
0/10OpenSSF Scorecard:Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
所用输入
has_nix
has_tests
lockfilespackage-lock.json
has_dockerfile
typed_language
bootstrap_filesMakefile
has_devcontainer
has_linter_config
typecheck_configs
agent_commit_share0.81
toolchain_manifests
dependency_bot_commit_share0
评分方式
0/45可类型检查的代码 — JavaScript,未配置类型检查
51.3/55可控的文件大小 — 采样的 30 个源文件中有 2 个超过 60KB
所用输入
primary_languageJavaScript
largest_source_bytes105,899
source_files_sampled30
oversized_source_files2

关键数据

0GitHub 星标
2贡献者
211最近 12 个月提交数
0距最近推送天数
0发布版本数
1巴士系数(bus factor)
0开放议题
npm, PyPI软件包生态系统数

数据采集警告

  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository
  • deps.dev does not index pypi:vibefoundry@0.4.2; advisories assessed against the repository dependency graph instead

更多细节

OpenSSF Scorecard 1.0 / 10
1.0综合

来自开源项目 OpenSSF Scorecard 的独立、工具无关的安全评估。每项检查奖励的是安全实践本身,而非特定供应商的工具。Scorecard 无法判定的检查项标记为 不适用,并从安全评分中剔除(绝不按零分计)。Scorecard v5.5.0 · 2026-08-01 03:26 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
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
不适用Dangerous-Workflowno workflows found
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
0Licenselicense file not detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
不适用Packagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
不适用Signed-Releasesno releases found
不适用Token-PermissionsNo tokens found
0Vulnerabilities22 existing vulnerabilities detected
直接依赖 40
注册表软件包版本约束清单文件
npm@clerk/clerk-react^5.61.6frontend/package.json
npm@codemirror/commands^6.10.1frontend/package.json
npm@codemirror/lang-css^6.3.1frontend/package.json
npm@codemirror/lang-html^6.4.11frontend/package.json
npm@codemirror/lang-javascript^6.2.4frontend/package.json
npm@codemirror/lang-json^6.0.2frontend/package.json
npm@codemirror/lang-markdown^6.5.0frontend/package.json
npm@codemirror/lang-python^6.2.1frontend/package.json
npm@codemirror/language^6.12.1frontend/package.json
npm@codemirror/state^6.5.4frontend/package.json
npm@codemirror/theme-one-dark^6.1.3frontend/package.json
npm@codemirror/view^6.39.12frontend/package.json
npm@tanstack/react-table^8.21.3frontend/package.json
npm@xterm/addon-canvas^0.7.0frontend/package.json
npm@xterm/addon-fit^0.10.0frontend/package.json
npm@xterm/xterm^5.5.0frontend/package.json
npmchart.js^4.5.1frontend/package.json
npmpapaparse^5.5.3frontend/package.json
npmreact^19.2.0frontend/package.json
npmreact-dom^19.2.0frontend/package.json
npmreact-json-view-lite^2.5.0frontend/package.json
npmreact-markdown^10.1.0frontend/package.json
npmreact-syntax-highlighter^16.1.0frontend/package.json
npmreact-window^2.2.6frontend/package.json
npmxlsx^0.18.5frontend/package.json
PyPIfastapi>=0.100.0pyproject.toml
PyPIuvicorn>=0.23.0pyproject.toml
PyPIpolars-lts-cpu>=1.0.0pyproject.toml
PyPIpyarrow>=14.0.0pyproject.toml
PyPIpandas>=2.0.0pyproject.toml
PyPIopenpyxl>=3.1.0pyproject.toml
PyPIfastexcel>=0.10pyproject.toml
PyPIxlsx2html>=0.6pyproject.toml
PyPIwebsockets>=11.0.0pyproject.toml
PyPIhttpx>=0.25.0pyproject.toml
PyPIxlsx2csv>=0.8.0pyproject.toml
PyPIpython-multipart>=0.0.6pyproject.toml
PyPIwatchdog>=3.0.0pyproject.toml
PyPIpython-dateutil>=2.8.0pyproject.toml
PyPItruststore>=0.9pyproject.toml
全部依赖 未采集

本报告未能采集到解析后的依赖集合:GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

原始 JSON 报告 机器可读
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 9351,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "CSS": 90287,
        "HTML": 1105,
        "Shell": 2304,
        "Python": 194931,
        "Makefile": 1160,
        "JavaScript": 238185
      },
      "pushed_at": "2026-08-01T03:23:43Z",
      "created_at": "2026-07-27T16:45:55Z",
      "owner_type": "User",
      "updated_at": "2026-08-01T03:23:52Z",
      "description": "VibeFoundry IDE engine — the standalone Python library (local data-science IDE: file management, script runner, data preview, metadata digests).",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": null,
      "default_branch": "main",
      "license_spdx_raw": null,
      "primary_language": "JavaScript",
      "significant_languages": [
        "JavaScript",
        "Python",
        "CSS"
      ]
    },
    "owner": {
      "blog": null,
      "name": null,
      "type": "User",
      "login": "vibefoundry",
      "company": null,
      "location": null,
      "followers": 1,
      "avatar_url": "https://avatars.githubusercontent.com/u/214882911?v=4",
      "created_at": "2025-06-04T18:16:36Z",
      "is_verified": null,
      "public_repos": 12,
      "account_age_days": 422
    },
    "license": {
      "state": "absent",
      "spdx_id": null,
      "raw_spdx": null,
      "file_present": false,
      "scorecard_found": false,
      "profile_has_license": false
    },
    "activity": {
      "releases": [],
      "recent_commits": [
        {
          "oid": "36aea3d168cd7339ac57458904bee1ae15ef1e5a",
          "body": "publish.sh bumped pyproject.toml but not __init__.py, so the 0.4.1 wheel\nannounced itself as 0.4.0 in --version and /api/health. Bump both together\nfrom now on.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "0.4.2: report the version we actually are",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-08-01T03:23:42Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "845293674c9411a2800b63cc1a1309f99509e07a",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "0.4.1: deterministic folder opening, Logs button, no scaffold on launch",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-08-01T03:22:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "90034f8a3becc5ec14a3a86e011133bf68c0ca0e",
          "body": "Launch created input_folder/output_folder/app_folder in whatever folder the\nbackend started on — the one place left that mutated a folder you merely\nopened. Every other path already lived by the opposite rule: generate_metadata\nno-ops until app_folder exists, the watcher only watches folders that ex\n[…]\n\n\nRemove the lifespan call so the rule holds everywhere: opening is read-only,\nand structure is created in exactly one place — the Build button.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Opening a folder no longer scaffolds it",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-08-01T03:11:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ff8d950f15ff8add6bb982bceab4f19833b347ae",
          "body": "It lived in the top bar, and the top bar only renders once a project is open —\nso the one state where diagnostics matter most, a pane with no backend and\nnothing loading, had no way to reach them. Float a Logs button whenever the\nbar is absent, so every state can produce a log, including total failure.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Make the Logs button reachable when nothing is working",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-08-01T02:57:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a8dedfae289a044a058dacd0a63973f86202feb6",
          "body": "One attempt was not enough in a pane. The widget renders off the tool\nDEFINITION, so it appears even when open_vibefoundry failed — and when the\nmodel retries with a corrected folder, the real backend arrives seconds after\nthe pane already gave up. The result was a dead folder picker reading \"Failed\n[…]\n for up to 90s before conceding to the picker.\nA live backend with no folder still gets the picker immediately — that is the\none case it is for.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Keep asking for the project folder until a backend answers",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-08-01T02:52:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "03f8ff525c5c01e87602a0a650a7d53aa883f88b",
          "body": "Removing it broke the pane. The host renders this widget off the tool\nDEFINITION, so it appears even when open_vibefoundry failed and no backend\nexists. Mounting <App/> unconditionally then put a full IDE on screen with\nnothing behind it: /api/folder/info failed, the IDE fell through to the folder\np\n[…]\nas.\n\nThe folder resolution is untouched: the host's root still decides which folder\nopens, and the IDE still opens straight into it.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Put the pane's launch button back",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-08-01T02:47:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "897a5e59157f589d2c4b8fe0785178078d29bc37",
          "body": "The IDE always booted into the folder picker: showFolderPicker started true\nand nothing ever called /api/folder/info, an endpoint that had no callers at\nall. The backend knew its folder the whole time — set from\nVIBEFOUNDRY_PROJECT_PATH at startup — so the picker was a question with one\nright answer\n[…]\nso a misbehaving UI leaves no evidence unless it keeps\nsome itself. In-memory only; it leaves the machine when someone presses Copy.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Open the project you launched, and add a Logs button",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-08-01T02:33:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "243655b5d88898fa198982bf061d759b7aa990e3",
          "body": "Reading a file to one base64 string and handing it to callTool crashed the\ndesktop app — a multi-megabyte string crossing the host bridge is a single\nenormous JSON value, and a large enough one aborts V8 and takes the app with\nit. A 12MB csv produced a 16.3MB message.\n\nThe file is now sliced and str\n[…]\nr interrupted stream aborts its buffer instead of stranding it.\n\nSame 12MB file: 49 messages, largest 341KB, arrives byte-identical.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Stream uploads from the pane instead of sending whole files",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-07-29T05:22:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d32681d33f1048f4f3c0aa31dcb1cf01f76d7520",
          "body": "Switching sheets re-parsed the whole workbook every time and shipped ~280KB of\nHTML per switch — most of it the same few style declarations repeated once per\ncell. In a pane every one of those bytes crosses the host bridge, which is\nwhere \"incredibly slow\" came from.\n\nThree changes:\n\nRenders are cac\n[…]\nrst attempt.\n\nVerified across all three writers (xlsxwriter, openpyxl, LibreOffice): 81ms\ncold, 0ms cached, correct chart per sheet.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Make sheet switching fast, and show each sheet only its own charts",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-07-29T05:03:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "133a8a7257dda281e24b97ced379a52e788edd5d",
          "body": "Three defects, all found by one file written by xlsxwriter rather than by\nopenpyxl. Every one of them was invisible against my own test files, which is\nthe whole argument for testing against something a user actually produced.\n\nCharts were looked for only at xl/charts/chartN.xml. xlsxwriter puts the\n[…]\nntended\ncolour beats losing the words.\n\nRegression-checked against openpyxl-written and LibreOffice-written files;\nboth still parse.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Handle real-world workbooks: chart location, series names, formats",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-07-28T17:55:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d62fe19f013867b621bb1835f9cd6870858df2c5",
          "body": "The approach Google Sheets takes with an uploaded workbook: don't reproduce\nthe file, rebuild it. Cells become HTML carrying their real fills, fonts,\nborders, merges and number formats; charts are read out of the workbook as\ndefinitions and redrawn. No LibreOffice, no 800MB install, nothing outside\n\n[…]\ne and copyable and the browser's own find works across it. \"View as\ndata\" re-reads with asData=1 for the sortable, virtualized grid.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Show spreadsheets as they look, by reconstructing rather than rendering",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-07-28T17:19:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8cae31700b36640fb02adb2bb8d76ffbb97438c6",
          "body": "Rendering spreadsheets faithfully worked, but only for someone who already has\nLibreOffice — an 800MB desktop app that pip cannot install and that many\ncorporate machines will not permit. That is the wrong shape for a feature\nevery cohort needs, so it goes.\n\nReverts the office module, the render end\n[…]\nreOffice still installed locally: .xlsx opens as a dataframe\nwith all columns and sheet names, and /api/office/render is gone (404).\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Remove the LibreOffice renderer, keep the xlsx fix",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-07-28T16:53:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e0f7c7d4c7148c46f78e15c061003417c1a64832",
          "body": "Opening an .xlsx parsed it into a dataframe, which threw away everything that\nmakes a spreadsheet a spreadsheet — charts, cell fills, merged cells, number\nformats — and showed a CSV-ish grid instead. .pptx had no handler at all.\n\nNo parser can fix this. openpyxl and SheetJS read values and some styl\n[…]\n survive, path traversal still 403s, and both outputs cross the\npane relay intact (html as text, pdf as base64 with a valid header).\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Show spreadsheets and decks as they actually look, via LibreOffice",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-07-28T16:45:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "27f905ffce51f82e70a139332f8dc6dedab83b4d",
          "body": "Launching from a host already chose the folder — it is the directory the host\nlaunched us against — but the picker still opened at the real home directory,\nso every launch began by navigating back to where you already were.\n\nThe picker starts wherever /api/fs/home points, and the shim already\ninterc\n[…]\nide\nand would break silently on any UI change. This is the deterministic part of\nthat fix — an API answer, no DOM, nothing to guess.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Open the pane's folder picker in the project, not the home directory",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-07-28T05:21:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "60d8a8ce2c7c783f8e474b431744a56e738a8ea3",
          "body": "Two things the pane could never do, both fixed in the shim rather than the IDE.\n\nImages: the app renders <img src=\"/api/image?path=...\">, which a fetch shim\ncannot intercept — the browser loads it directly, and in the sandbox that\nrelative URL resolves against the widget's origin rather than the bac\n[…]\nffected.\n\nVerified against a live backend: the image arrives byte-identical with its PNG\nmagic intact, and the upload lands on disk.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Carry images and uploads across the pane's relay",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-07-28T01:01:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "595905aef20466b0834047807cd26f3926e0e793",
          "body": "Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Bump to 0.3.2 (pane polling bridge)",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-07-27T21:38:39Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5f3e19fbd9c962ee7b8bbd5e9939275a5284112a",
          "body": "The sandbox blocks websockets to localhost, so the pane replaced WebSocket\nwith an inert stub. Anything waiting on a server-pushed event therefore\nwaited forever: opening a large file for the first time left the preview\nmodal on its spinner permanently, because it waits for profile_complete.\nThe sec\n[…]\nalse, the\nserver answering \"watch the websocket\", and the profile arriving by polling\nin 0.4s with all 5 columns and 5,000,000 rows.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Make the pane's websocket a polling bridge instead of a dead stub",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-07-27T21:32:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "607d86c4f4a2047027896c77d008e9d99357ea76",
          "body": "Restores pane support, but far smaller than it used to be. Pane mode used to\ncarry the neutral theme and hide the script runner; the theme is now the base\nfor everyone and the runner is gone, so all that remains is hiding the four\nterminal-launcher buttons — they open a native window that a sandboxe\n[…]\nges layouts.\n\nNone of this reaches the standalone app: main.jsx never imports pane-main,\nand vite.config.js -> static/ is untouched.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add the Codex pane build target",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-07-27T18:56:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5526c93ab18ef99122d487a49688b6e8669c1e4d",
          "body": "The blue-tinted standalone palette was only ever repainted neutral when the\nIDE ran embedded in a host pane. Make that neutral palette the base instead —\nwhite/gray surfaces, near-black accent, system font — so the IDE looks the\nsame standalone or embedded, and no webfont is fetched at startup.\n\nRem\n[…]\noding the version in the footer: it had drifted to v0.1.38\nwhile the package was at 0.2.22. The footer now reads it off /api/health.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Adopt the host-native skin and drop the bottom script runner",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-07-27T17:55:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "10d8b4d6d225a742820f154cbd00f918bbbdda5e",
          "body": "Takes the tree at 19b3301 — the last commit before the Codex/Claude\nplugin, SharePoint connector, and data catalogue work — as the starting\npoint for the standalone Python library. Version goes to 0.3.0 so it\nlands above the 0.2.52 currently on PyPI; __init__ was stale at 0.2.11\nand now matches.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fork the IDE engine at 0.2.22 into vibefoundry-python-lib as 0.3.0",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-07-27T16:45:50Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "19b330167e825eec5a7285cd95095dba41df759f",
          "body": "Right-click .command files now shows Run Code / Copy run command,\nrunning them via bash like .sh.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "0.2.22: add Run Code option for .command files",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-06-21T23:52:13Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ea8552df32f3bbd472591425ac6506cfa1ec1b05",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Remove unused template-cascade helpers from server.py",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-06-21T23:52:13Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4d89d0e7d8507408c54de9940b1f6a5debea9c50",
          "body": "IDE templates moved to the website repo (vibefoundry/website, templates/ on\nmain); the /api/templates proxy reads from there now, so this folder is no\nlonger the source the IDE downloads from. Recoverable from history if needed.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Remove templates/; now hosted in vibefoundry/website",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-06-11T23:07:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b4d4de22b5f4ce8eb141aeb6553b2373ae323277",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "templates: add packaged_publish (conda-pack desktop app packager)",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-06-06T00:45:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4ffab768bf92cf58513c3b3158030071da1e7663",
          "body": "The build env is created from conda-forge with --override-channels, and\nconda-forge's python does not bundle pip. So 'python -m pip install -r\nrequirements.txt' failed with 'No module named pip'. Add pip to the\nconda create spec so the env has it before installing the app deps.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "data_chatbot_codex_publish_v2: install pip in the conda-pack build env",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-06-05T19:06:09Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e4df5d517c9bbceebbbe71fd0de994a5011a6d82",
          "body": "The v2 template files were already on dev_branch but absent from\ncatalog.json, so the IDE picker never showed it. Add its catalog entry\n(conda-pack publisher variant of data_chatbot_codex_publish) so it\nbecomes downloadable.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "catalog: list data_chatbot_codex_publish_v2 as a downloadable template",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-06-05T18:56:02Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b9bae630a2c7f2406c4147a5176b6a8b8dcfb0b8",
          "body": null,
          "is_bot": false,
          "headline": "IDE Changes",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-06-05T18:52:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dd17a8f643e76740481714fd2c6549766f0dcb07",
          "body": "Students run publish.py on Windows, where npm/node are .cmd shims that\nCreateProcess can't launch by bare name — subprocess.run([\"npm\",...]) failed\nwith WinError 2 at the 'npm ci' build step. Pass shell=True on Windows so cmd.exe\nresolves the .cmd. No change on macOS. Fixed in both published copies.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "publish.py: run subprocesses via shell on Windows (fix npm WinError 2)",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-06-05T13:32:21Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bb098f2f94a576379bb9144cb5c45afacbf7b425",
          "body": "The Codex CLI data chatbot with a drop-in Publish/ folder (publish.py + LLM\nREADME) and the app-level changes that make it publishable: single-server\nfrontend serving + heartbeat lifecycle in app.py, the Windows codex full-path\nlogin fix, and PWA/heartbeat hooks in the frontend. Registered in catalog.json.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add data_chatbot_codex_publish template — publish-ready Codex chatbot",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-06-05T13:19:56Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d0cc341639f2df56deca3b1ae40ed2b060165486",
          "body": "A standalone, portable Publish/ folder (publish.py + vf_logo.png + an LLM README)\nthat packages any VibeFoundry app into a self-contained one-click desktop\ninstaller for macOS + Windows. Registered in catalog.json so it's pullable.\nThe README documents the app↔publish contract, the exact 7 edits that make a\nchatbot app publish-ready, and the agent-CLI (codex) fixes.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add 'publish' template — drop-in desktop-app packager",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-06-05T05:42:53Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b114be57c5cf14b47003bc001b019a42fbbc825e",
          "body": "Save builds under published_apps/dashboard_v{N} in the script's own folder\n(created on first build) instead of app_folder/. Each build still increments to\nthe next version.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "dashboard_pwa_duckdb: publish into published_apps/ next to the script",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-06-04T18:05:19Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9c2db05be96e603629c45e7e18c5e55bdcdb0125",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Remove CLERK_INTEGRATION_PLAN.md",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-06-04T17:58:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c5eae8f97c50ff439d09247efd12baccfcb98b42",
          "body": "Save the distributable inside app_folder/ as an auto-incrementing\ndashboard_v{N} folder (next past the highest existing version) instead of\noverwriting <project>/output_folder/dashboard_pwa_duckdb each build.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "dashboard_pwa_duckdb: build into app_folder/dashboard_v{N}",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-06-04T17:58:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "cb15fb3831122c4b71083929a4295fd065fdb575",
          "body": "A node_modules/ installed from before concurrently was added to package.json\nhas vite but not concurrently, so the vite-only sentinel in run_app.sh/.bat\nskipped setup and then died at the concurrently call. Check both binaries so a\nstale/partial tree re-triggers setup. Also locks concurrently in package-lock.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "data_chatbot_codex: gate setup on concurrently too, not just vite",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-06-04T17:58:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "fde68194729fa43388869d9665242e48e898f289",
          "body": "The fullstack launchers reached concurrently via `npx`, which does an npm\nregistry-resolution round-trip (can stall/hang on slow or Windows machines)\neven with the package already installed, then ran the frontend through an\nextra `npm run dev` Node bootstrap.\n\n- Declare concurrently as a devDependen\n[…]\naunchers call it\n  once instead of spawning python twice\n- setup.sh/.bat drop the now-redundant separate concurrently-install step\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "data_chatbot_codex: faster launch — drop npx, run vite directly",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-06-02T20:31:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7eb47f560663ef42b7a2114993907a1ee4845c2c",
          "body": "subprocess.run with text=True uses the system default encoding, which\non Windows is cp1252. Codex requires UTF-8 on stdin — any em dash,\ncurly quote, or non-ASCII character in the prompt (from metadata.json,\ninstructions.json, etc.) caused \"input is not valid UTF-8\" and exit 1.\n\nAdding encoding=\"utf-8\" is a no-op on Mac/Linux where UTF-8 is already\nthe default.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix codex stdin UTF-8 error on Windows",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-29T02:08:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "22f159c10709dd50a5d37513281822922e20bd3a",
          "body": "On Windows, subprocess.run([\"codex\", ...]) does a PATH lookup inside\nthe child process environment, which can differ from the shell that\nstarted Flask (PATH set by an installer after the terminal opened, or\nconcurrently running with a trimmed env). This caused [WinError 2]\n\"The system cannot find th\n[…]\nutil.which() once at the top\nof _run_codex and pass that path to subprocess.run, bypassing the\nchild-process PATH lookup entirely.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix codex subprocess WinError 2 — use absolute path from shutil.which",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-29T02:04:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6350b351335631cf6d235ab718d583b78bd398dc",
          "body": "- All 3 run_app.bat files now print [run_app] progress at every step so\n  a silent failure on Windows is immediately visible instead of a blank\n  terminal.\n- Each failure branch now ends with `pause` so the window stays open\n  long enough to read the error.\n- Port-reservation now validates the resul\n[…]\ns machines that call hangs indefinitely contacting the auth\n  server. Auth errors are handled by the in-app re-auth modal instead.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add step-by-step logs to run_app.bat; remove hanging codex auth check",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-29T01:57:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f36f17fe29acb20f8f791c0fd673245652bb2d18",
          "body": "Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "0.2.21: templates picker row layout",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-29T01:35:09Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4618592e4b96ab88b810f791a917c7f817f5e3f7",
          "body": "Replace the auto-fill grid of square cards with a vertical stack of\ncompact rows — icon, title + track badge, 2-line clamped description,\nDownload button on the right. Use_cases list and +N more toggle\nremoved; description carries the gist. Easier to scan when several\ntemplates are listed.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Templates picker: row layout instead of card grid",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-29T01:34:11Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bd3afc307333f8bf0f8952737906ae3115bd0256",
          "body": "The inline `python -c \"import socket; ... s.bind((''''127.0.0.1'''',0)) ...\"`\nused quadruple single quotes as a `for /f` escape trick. CMD on multiple\nWindows shell variants does NOT reduce that to a single `'` before\nPython sees it — Python receives the literal `''''` and raises\n\"unterminated strin\n[…]\n3 launcher reference snippet in AGENTS.md (with the helper file\ncontent documented so students building from scratch can ship it).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix Windows port-reservation SyntaxError in run_app.bat",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-29T01:33:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5995a61971400fa1e9b84ec51f35470e7dac0d73",
          "body": "Run Code was added in 0.2.14 for .py and .sh only. The asymmetric\nallowlists hid the menu item for .bat even though Copy run command\nalready handled it. On non-Windows the backend's runner.py returns\na clear \".bat files can only run on Windows\" error — that's a better\nUX than silently hiding the option.\n\nTwo-line change: add .bat to isRunCode and to handleRunCode's\nextension switch.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "0.2.20: enable Run Code for .bat files",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-29T01:31:21Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4e4df5fdbc104504a043359df8b92d8a8f6a1586",
          "body": "The clean-install if-block had unescaped parentheses inside echo and REM\nlines nested inside the parenthesized `if not exist (...)`:\n\n    echo Installing Node dependencies (clean install)...\n    REM with broken perms (EACCES on esbuild's postinstall, etc.) make\n\nCMD pre-parses the whole block and tr\n[…]\n nothing else\nchanged. Applied to all three Track-3 setup.bat templates\n(data_chatbot, data_chatbot_codex, doc_scanner_fullstack).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix Windows CMD parser failure on setup.bat at [2/3] Node deps",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-29T01:25:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "22bf5c047c313daf2bffe211e1cdcff73b2b62c8",
          "body": "The concurrently sentinel was a subprocess probe (`npx concurrently\n--version`) that hits the npm registry even when the package is already\nlocally installed — on Windows / corporate proxies / slow networks this\ncan hang setup forever at \"[3/3] Checking concurrently...\".\n\nReplaced with a direct bina\n[…]\n\nthe other Track 3 templates) so node_modules/, agent_results/,\ndocument_input/, and .env can never accidentally ship via cascade.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix Windows setup.bat hang on `npx concurrently --version` check",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-29T01:18:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "989130e8c75268a4dda738da8970bd651626bf04",
          "body": "Two new Track 3 templates for natural-language analytics over parquet:\n\n- data_chatbot — Flask + React + Polars code-gen chatbot. Three-stage\n  pipeline (classify → codegen+retry → execute → answer) streamed to\n  the UI via SSE. The model sees only metadata.json (column/value\n  profile from data/), \n[…]\nents gitignored; .gitkeep preserves the empty folder\n- existing .gitignore already excludes node_modules/, output/,\n  __pycache__/\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add data_chatbot + data_chatbot_codex templates to catalog",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-29T01:17:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fd8e36e644066689922a4d6491b15f8de3717c03",
          "body": "Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "0.2.19: fix folder upload jumbling",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-29T00:19:21Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b4bd94fa7feb1af058323c1fb3a210f94548d730",
          "body": "The Add Folder context-menu upload built each file's destination on\nthe frontend by combining node.path with the subdir slice of\nwebkitRelativePath. Two failure modes:\n\n1. node.path with a leading slash propagated into the destination,\n   producing an absolute path that Path division at the backend\n\n[…]\nible: callers that don't send relativePath fall back\nto file.filename and land directly inside folder, matching the old\nbehaviour.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix folder upload jumbling — preserve webkitRelativePath structure",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-28T23:46:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ff8300a76d1fbc52ebee85320c770baa2174127f",
          "body": "Track 4 (doc_scanner_backend) now ships requirements.txt (openai,\nwatchdog, pillow) plus idempotent setup.sh / setup.bat that check\npip show <pkg> before installing. run_app.sh / .bat auto-trigger\nsetup when any required dep is missing, so a fresh clone runs in\none command.\n\nTrack 2 (dashboard_pwa_d\n[…]\nper track) and the Track 4 Launcher Scripts\nsection is rewritten to include the new requirements / setup /\nauto-trigger templates.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "templates: add requirements.txt + setup.sh/.bat for Track 4",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-28T19:54:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "464f511c936170135dab7619229c296fa064ecbf",
          "body": "Build no longer cascades any templates — it just creates the project\nskeleton and AGENTS.md. Templates are now opt-in via a Templates dropdown\nin the toolbar that exposes Download (per-template picker driven by live\ncatalog.json from the proxy) and Delete (wipes templates/).\n\n- /api/build: strip cas\n[…]\no templates/{id}/\n- DELETE /api/templates: rmtree templates/\n- Frontend: Templates ▾ dropdown, picker modal, danger confirm dialog\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "0.2.18: on-demand template download via Templates menu",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-28T18:45:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2bb792032575710f8c068891313dc0314cc59a1d",
          "body": "Follow-up to 0.2.17: comment referenced the old pwa_duckdb name.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix stale template path in FileTree comment",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-28T18:15:15Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7e977ebc3b00e7373f1336ce9117eb56926b3f07",
          "body": "Renames the three cascaded template folders to student-readable, intent-\nrevealing names:\n  agentic_framework    → doc_scanner_backend\n  pwa_python_backend   → doc_scanner_fullstack\n  pwa_duckdb           → dashboard_pwa_duckdb\n\nAdds templates/catalog.json — one consolidated description + use_cases \n[…]\ned end-to-end with the new names and a \"Cascaded template\"\ncolumn in the track table so the template-to-track mapping is explicit.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "0.2.17: rename templates and ship catalog.json + icons via cascade",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-28T18:01:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b1784b0296d883520ac8e08b62c0b6bc8b2f4fb3",
          "body": "… proxy\n\nBuild now lists the top-level dirs under templates/ on the proxy and cascades\neach, instead of a hardcoded list. New templates ship by dropping a folder at\nthe source — no client upgrade needed for future template additions.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "0.2.16: dynamic template cascade — discover template folders from the…",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-25T18:52:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "582ceeaf58c781e0c686fe46b4690c29f10a3ba1",
          "body": "…tion; cascade all three on Build\n\n- New Track 4 (Building Agents) template: templates/agentic_framework/\n- New Track 3 (PWA + Python Runtime) template: templates/pwa_python_backend/ (flattened layout)\n- AGENTS.md: API keys now live in a .env at the app-folder root (app_folder/scripts/{app_name}/.en\n[…]\nplorer now surfaces .env files (_is_env_file)\n- server.py: /api/build cascades pwa_duckdb + agentic_framework + pwa_python_backend\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add agentic_framework + pwa_python_backend templates; .env key conven…",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-25T03:55:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ce886b177c697adc6da4dd168f0de578da75f331",
          "body": "- New \"Run Code\" item in the file-tree right-click menu for .py and\n  .sh files: opens a fresh native terminal and runs the script from\n  the project root (python/bash with the absolute path).\n- Fix /api/terminal/launch: the macOS AppleScript path interpolated\n  request.command unescaped, so a quote\n[…]\nleScript literal — quoted/space-containing paths\n  now work. (The Claude/Codex buttons never hit this; they pass bare\n  commands.)\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "0.2.14: \"Run Code\" context-menu action for .py/.sh",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-19T18:10:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "255d0408efaaabeca3530774c3474eac47432877",
          "body": "- New POST /api/files/reveal endpoint: reveals a file/folder in the\n  OS file manager (Finder -R / Explorer /select / xdg-open), with the\n  same project-folder path containment check as the other fs endpoints.\n- FileTree right-click menu gains an \"Open in Folder\" item wired to it.\n- BUILD.md documen\n[…]\nlow, which caches need clearing\n  (Python artifacts, not the self-clearing static dir), and the service\n  worker staleness caveat.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add \"Open in Folder\" context-menu action + BUILD.md",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-19T15:06:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ca0aed0f63d0ff990f6dbae7127ce7057cc991c9",
          "body": "…n't break AGENTS.md fetch",
          "is_bot": false,
          "headline": "0.2.13: use OS trust store via truststore so corporate TLS proxies do…",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-07T21:05:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bb8682a71fb5637d7da3b6a8552fed2a69c97996",
          "body": "- JSON viewer: replaced react-json-view-lite with custom recursive component;\n  always-expanded by default, click ▾/▸ to collapse, light theme, scrollable.\n- File tree context menu: new \"Add Folder\" action uploads an entire folder\n  from disk (preserves subdirectory structure). Renamed \"Add Folder\" \n[…]\nnt so any\n  path component embedded in a filename gets created.\n- User-facing error strings: \"Failed to upload\" → \"Failed to add\".\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "0.2.12: JSON viewer rewrite, Add Folder upload, junk-file skips",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-05T21:04:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d5ff7ec9d193be055d5ea6069cd6100a55ff390a",
          "body": "Add a tight Geospatial defaults subsection so the agent has a known\nstarting point for map-based PWA tasks instead of picking libraries\nad-hoc per task:\n\n- Default library: Leaflet (over deck.gl, unless 100K+ points or user\n  asks for deck.gl explicitly).\n- Default basemap: OpenStreetMap tiles, with\n[…]\nverything else (choropleth, clustering, projection details) is left to\nthe agent — consistent with the broader Stay In Scope rule.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "AGENTS.md Track 2: geospatial defaults",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-05T19:10:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "30e42e3dfb90e6c5c73bf83623aa329c854f45e3",
          "body": "No code changes — version bump to mark the release of the agent-side\nguardrails:\n\n- AGENTS.md: \"Stay In Scope\" universal rule (no aesthetic edits, no\n  feature additions, no defensive cleanup, no refactors unprompted).\n- AGENTS.md: Track 2 now opens with a hard pointer to\n  templates/pwa_duckdb/CUST\n[…]\nojects via the templates proxy, so\nexisting 0.2.10 installs see the new rules on next Build. Republishing\njust stakes the version.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "0.2.11: agent guardrails (Stay In Scope + CUSTOMIZE.md routing)",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-05T16:29:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "24184fd482f846263199fd1a6fc763989abf60de",
          "body": "Previous policy (\"no filter fields, user picks\") rendered a usable\ntable but an empty filter sidebar (\"No Filters Configured\") on first\nlaunch — surprising and not actually what users want. Flip the default:\nthe agent picks a filter widget per column based on dtype + cardinality,\nuser refines after \n[…]\n on\nstring columns only). Numerics and booleans need no inspection beyond\nthe dtype; the existing head(5) call already gives that.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "CUSTOMIZE.md: add sensible default filters per column",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-05T16:28:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2641440a2da69f2c0e0c8c8fde734613e9391be0",
          "body": "Three connected changes meant to stop Codex (and any other agent) from\nrewriting template files instead of cloning them:\n\n1. AGENTS.md — universal \"Stay In Scope\" rule (right after \"templates/\n   is read-only\"). Explicit don'ts: no aesthetic edits, no feature\n   additions (charts/leaderboards/summar\n[…]\nree to user projects on next Build, so the\nguardrails are in writing for the next agent run rather than just in\nthis conversation.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "AGENTS.md + new CUSTOMIZE.md: scope rules and Track 2 routing",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-05T16:18:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "eee449003eb0e7ee775dcb0427d251aa0439a68e",
          "body": "FileTree:\n- Templates expansion now lives in its own state (userExpandedTemplates),\n  fully separated from expandedPaths. Render path for any templates/\n  folder reads only from that state, so cascade-driven file additions\n  can never auto-expand the folder. Only chevron click writes there.\n- Hoiste\n[…]\n.jsx):\n- \"Local Terminal\" button → \"Terminal\".\n- Removed the filename / \"No file selected\" label from the Files/Preview\n  toolbar.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "0.2.10: templates collapse fix, resilient cascade, UI tweaks",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-05T13:35:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "96b694fe990fdc153883b0ce1b388fcbd998f926",
          "body": "FileTree:\n- Add 'templates' to NEVER_AUTO_EXPAND so the initial tree-load effect\n  doesn't pop it open alongside app_folder / input_folder / output_folder.\n- Add an early-return guard inside expandToPath itself so any future\n  caller (watcher events, scroll-to-path, etc.) is silently no-op'd\n  for p\n[…]\n\n  after \"Input Data Is Sacred\". Forks-only policy: copy out of\n  templates/ into app_folder/scripts/{name}/, never edit in place.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "templates/ is read-only: never auto-expand, never edit",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-05T12:38:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e2073b1c7a1961c8d75b751b9ed63e1fcb2b624d",
          "body": "Doc had been describing an aspirational Vite/esbuild/npm flow that no\ntemplate actually implements. Update Track 2 to match what pwa_duckdb\nships:\n\n- Source layout uses app_core/src_app/ with pre-bundled lib/ committed\n  (no npm, no esbuild, no unpkg fetch — Python-only on the dev side).\n- Build scr\n[…]\n\n  build-and-launch is reserved for distributable dogfooding.\n- Constraint #3 flipped: no Node.js anywhere, including dev machine.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "AGENTS.md Track 2: align with shipped pwa_duckdb arch",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-05T12:29:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d1e0d4d669295c32d27acfbf9d705ea6e4ddef8d",
          "body": "- /api/build now cascades templates/pwa_duckdb/ via the authenticated\n  proxy into <project>/templates/pwa_duckdb/, including binary assets\n  (.wasm, .parquet, prebuilt JS bundles).\n- _cascade_templates_via_proxy() takes an optional subpath and sends\n  Accept: application/vnd.github.raw on per-file \n[…]\nex shims; pwa_duckdb is now the only\n  cascadable template.\n- Root the lib/ and lib64/ ignores so templates/**/lib/ stays tracked.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Cascade pwa_duckdb on Build; replace legacy templates",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-05T12:16:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c308f6f5453afe13b6039d8ac598e4b6ead3a3eb",
          "body": "Restores the AGENTS.md content from the commit immediately before\n0578adf introduced the on-disk template subfolders. Templates are no\nlonger cascaded by Build, so the doc shouldn't reference them.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Revert templates/AGENTS.md to pre-templates version (1238ac8)",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-04T14:52:22Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "203ac83219c706b8afe59d3dfbd658311279f2d7",
          "body": null,
          "is_bot": false,
          "headline": "0.2.9: Build cascades AGENTS.md only — no template subfolder cascade",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-04T10:55:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b9b295db6ea186d32b5a9adebd8f7a0574b782c1",
          "body": "Build now only creates the folder structure (input_folder/, output_folder/,\napp_folder/) and runs git init. It no longer fetches AGENTS.md or any\ntemplates from the proxy. Users who want templates should grab them\nmanually until cascade is re-enabled.\n\nReasoning: tonight's testing showed Codex behav\n[…]\ne-enable cascading later, restore the _cascade_templates_via_proxy\ncall + the public-fallback AGENTS.md fetch in build_project — both are\nstill defined as helpers in server.py, just no longer invoked.",
          "is_bot": false,
          "headline": "0.2.8: disable template cascade on Build",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-04T10:50:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "973ec2b85c1672496630b87d66c5d8f79d9ba00c",
          "body": "…om feef873)",
          "is_bot": false,
          "headline": "Revert AGENTS.md to pre-yesterday state (0578adf, 33 lines removed fr…",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-04T10:45:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5544a2a7e21a7ddfdb974f061955c1a103f4c46a",
          "body": "Restores the AGENTS.md state from before tonight's iterative rule\nadditions. Cascading system, templates, and IDE all stay on the\nlatest commits — only AGENTS.md is rolled back. Tonight's rules\n(brief recon, build fast, no rescan, trusted workspace, partial\ntemplate matches, etc.) are gone from this file.\n\nIf we want any of those rules back, they're recoverable via:\n  git log --oneline templates/AGENTS.md\nand cherry-picking specific commits.",
          "is_bot": false,
          "headline": "Revert templates/AGENTS.md to yesterday's version (feef873)",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-04T10:44:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1e692089be3253e7f397aa5696c30ab26f2a8de7",
          "body": "…et URL\n\nTwo fixes after testing the plain-script migration end-to-end:\n\n1) DuckDB-WASM doesn't ship a UMD/IIFE build on unpkg — only ESM/CJS.\n   The previous prepare_dev_assets.py URL pointed at duckdb-browser-eh.js\n   which doesn't exist (only the .worker.js variant does, plus the\n   ESM/CJS main \n[…]\ntarts, the map's basemap should\nappear. County boundary GeoJSONs are still gitignored — that's the\ndeferred external-hosting task.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "templates: ship pre-built DuckDB IIFE bundle, drop COOP/COEP, fix ass…",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-04T10:12:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b9569486fe5752bd1696c15464d76cb541250faf",
          "body": "geo_dashboard and trend_analytics_dashboard now use the project's\ncanonical Track 2 architecture (per AGENTS.md): UMD libs loaded via\n<script>, DuckDB-WASM IIFE bundle from unpkg, Python's built-in\nhttp.server with COOP/COEP headers for SharedArrayBuffer. Students\nneed only Python — no Node, no npm,\n[…]\nntentionally still use Vite — that's\nthe right tool for React + backend dev workflows and isn't affected\nby the Track 2 migration.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Migrate Track 2 templates from Vite to plain-script (no npm, no Node)",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-04T09:57:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "eeedbc38abe14069991a6052b8173d823734c7a5",
          "body": "…resh-write\n\nMost build requests are an 80% template match — the chassis (Vite,\nlaunchers, port logic, DuckDB-WASM, packaging) fits but the specific\nfeatures (charts, filters, columns) differ. The wrong instinct is to\nwrite the app from scratch because \"the template doesn't have feature X\"\n— that re\n[…]\nplate doesn't ship, ADD them.\n   Never tell the user \"the template doesn't support that\". Extend it.\n\nMental model added at the end: template = chassis, features = body\npanels you bolt on or swap out.",
          "is_bot": false,
          "headline": "AGENTS.md: rule for partial template matches — fork + extend, never f…",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-04T09:18:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f8b22a38f41b20521a6c72f94794aa64db616475",
          "body": "Adds a hard rule directly under the \"Which Track?\" section so the\nmoment Codex picks Track 2 or Track 3, its very first read is the\ntemplate's CUSTOMIZE.md — not app.js, not prepare_dev_assets.py,\nnot anything else. The recipe tells the agent which one file (usually\njust app_config.json) needs editing and lists what NOT to touch.\n\nTrack 1 keeps the existing pattern (read template's app.py for\nreference, write task fresh).",
          "is_bot": false,
          "headline": "AGENTS.md: route to template CUSTOMIZE.md immediately after track pick",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-04T09:15:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "69fd49b7bd2e161760868572c257eb6ff20b32cc",
          "body": "Each Track 2 template (geo_dashboard, trend_analytics_dashboard) now\nships a tight 5-step CUSTOMIZE.md at its root, designed for the agent\n(or a human) to follow in 30-60 seconds rather than minutes:\n\n  1. Read input_metadata.txt to identify the user's data\n  2. Fork the template (with sample_data/n\n[…]\n go off and edit 1600 lines of JS that are already config-driven.\n\nAGENTS.md now points to the per-template CUSTOMIZE.md as step 3 of\n\"How to use a template\" — agent reads it first before refactoring.",
          "is_bot": false,
          "headline": "templates: ship CUSTOMIZE.md recipe per template + point AGENTS.md at it",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-04T09:13:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7b8833900422c74eaba01fb0cfd6897b3c9616ef",
          "body": "Replaces the prior \"no upfront recon\" rule with the Claude-Code-style\n\"brief recon then build\" pattern. Allows a quick metadata read and a\nsingle glance at project structure but bans:\n\n- Spawning sub-agents to \"explore\" or \"research\" before any edit\n- Opening 10+ files to \"understand the codebase\"\n-\n[…]\n\n- Recursive cataloging of app_folder/scripts/ or output_folder/\n- Extensive multi-step \"planning\" before any user-visible action\n\nTarget: first file edited within 10-20 seconds of the user's request.",
          "is_bot": false,
          "headline": "AGENTS.md: brief top-level recon, no agent-swarm pre-build phase",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-04T08:52:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c90dbe076fc09766dda615897d1b0de0b91c9806",
          "body": "Stops Codex from spending 2 minutes scanning input files, listing\ndirectories, reading \"the codebase\", and sample-querying data before\nwriting a single line of code.\n\nHard rule near the top: when asked to build, start writing code now.\nUse the cached metadata for schema/types/row counts. Don't scan,\ndon't list, don't sample. If something isn't in the metadata, ask\nONE specific question — don't recon.",
          "is_bot": false,
          "headline": "AGENTS.md: start building immediately — no upfront file recon",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-04T08:51:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3eba8c73831dd401faa938ca323b72af3f87dae5",
          "body": "Adds a \"Build fast\" section directly after the no-rescan rule. The\nexisting rules said \"don't re-scan\" but didn't address the bigger\nissue: Codex was running the pipeline after every single file edit,\nturning a 30-second task into 5+ minutes.\n\nNew rule, three lines:\n1. Read cached metadata so you kn\n[…]\np2, running pipeline...\n- Editing one step then re-running the entire pipeline to \"make sure\"\n- Running each new file just to confirm it executes\n- Reading back files you just wrote to verify contents",
          "is_bot": false,
          "headline": "AGENTS.md: build fast — write everything, run once",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-04T08:50:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6a3564d885173a25d94577fd8fbc45216dfa8587",
          "body": "…first\n\nCodex was running pl.scan_csv / pl.scan_parquet repeatedly before\ndoing actual work, even when the IDE had already scanned the same\nfiles and stored the results in app_folder/meta_data/{input,output}_metadata.txt.\n\nAdds a 4-step rule near the top of AGENTS.md:\n1. Read meta_data/*.txt before \n[…]\nIDE already paid for it\n2. Only scan when you need stats the metadata doesn't have, then once\n3. Never re-scan to \"verify\" your own outputs\n4. Never re-run the whole pipeline to test one step's change",
          "is_bot": false,
          "headline": "AGENTS.md: hard rule against endless pl.scan_* — use cached metadata …",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-04T08:48:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d3b069591cdca3be42d83799ef27eeeb1296db50",
          "body": "When the harness prompts for approval on routine commands in a fresh\nworkspace, the agent now offers a one-time setup using a specific\nphrasing the user can recognise:\n\n  \"AGENTS.md would like to set up your Codex for smoother approvals.\n   Mark this workspace as trusted so I stop asking permission \n[…]\nys to ~/.codex/config.toml. After that one\napproval, no more prompts in any project on that machine.\n\nTwo safety rules: never run without explicit approval, never propose\nmore than once per workspace.",
          "is_bot": false,
          "headline": "AGENTS.md: agent proposes setup_codex.sh with exact approval wording",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-04T08:31:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f443e7eeeb126bd81fe30923a482872feaf6d147",
          "body": "…TS.md\n\nThe auto-write helper kept producing TOML files that Codex's parser\nrejected with 'invalid type: string \"never\", expected u32 in\ntui.model_availability_nux' — not worth the schema-fragility for a\nprompt-skipping nicety.\n\nWhat ships now:\n- Removed _ensure_codex_trusted() helper and its call f\n[…]\ns whose\n  harness keeps prompting anyway. The agent reads this on every\n  interaction and the user reads it when opening the file.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "0.2.7: revert auto-write to ~/.codex/config.toml; move policy to AGEN…",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-04T08:27:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "55c048aebfdd5542809717f38031ec1fb383e273",
          "body": "The previous implementation appended new keys at the end of the file.\nIf the user's existing config ended with a [section] (e.g.,\n[tui.model_availability_nux]), TOML's table-scope rules slurped the\nnew approval_policy = \"never\" into that table — breaking config load\nwith: invalid type: string \"never\n[…]\nwhitespace) immediately before it, so they stay top-level. Falls back\nto append-at-end only when the file has no [section] at all.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "0.2.6: fix _ensure_codex_trusted to insert ABOVE first [section]",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-04T08:22:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "eb680f2eb844e6a782a97708e405f51dbee18e6c",
          "body": "Adds _ensure_codex_trusted() helper that's called from /api/build\nafter folder scaffolding. It writes two keys to ~/.codex/config.toml\n(approval_policy = \"never\", sandbox_mode = \"workspace-write\") if and\nonly if they aren't already set — preserving any manual config the\nuser already has.\n\nEffect: st\n[…]\nriting to ~/.codex/ fails for any reason\n(permissions, missing dir, etc.) we log and continue — Build never\nfails because of this.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "0.2.5: Build auto-trusts the workspace for Codex CLI",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-04T08:18:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5c9e28f7c7264fd0513f1e95ece10b845cc25bcd",
          "body": "Updates the comment headers in both setup_codex.sh and .ps1 to\nexplicitly list what falls under the \"trusted workspace\" policy\nand what still requires approval. Mirrors the standard \"Trust\nworkspace\" pattern from VS Code / Cursor / Codespaces.\n\nAUTO-APPROVED (inside the workspace only):\n  - File exp\n[…]\nthe project (scp, curl uploads, etc.)\n  - Plans for multi-step builds (agent-side, AGENTS.md-governed)\n  - Judgment-call questions\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "codex setup: enumerate exact auto-approve scope (D&T-friendly)",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-04T08:09:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e565803a9f55381efd63fffd680c2bac77d2105e",
          "body": "setup_codex.sh / setup_codex.ps1 are one-time-run scripts that mark\nthe user's workspace as trusted in their global ~/.codex/config.toml,\nso Codex stops prompting for approval on every shell command and\nenv-var prefix.\n\nSpecifically: sets approval_policy = \"never\" and sandbox_mode =\n\"workspace-write\n[…]\nBoth scripts are idempotent — they back up the existing config to\n~/.codex/config.toml.bak before patching, so re-running is safe.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add codex-setup scripts for both shells (Mac/Linux + Windows)",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-04T08:07:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "59d672d8afac265a5e35a47ddcf9ca57e5c2f452",
          "body": null,
          "is_bot": false,
          "headline": "AGENTS.md: make shell-command rule symmetric (Mac/Linux + Windows)",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-04T08:00:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f3cdb85a0a12374f7a167a9e13d35417d8f561d0",
          "body": null,
          "is_bot": false,
          "headline": "AGENTS.md: tell agents to match shell commands to the host OS",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-04T07:59:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dc0942ede4f42cdc7a6f5fec8e7285ca004180da",
          "body": "…2/T3\n\nTwo related rules added to the \"How to use a template\" section:\n\n1) Track 1 templates are reference material only. The agent should\n   read them to learn the pipeline pattern, then write the new task\n   from scratch in app_folder/scripts/. Never `cp -r` a Track 1\n   template — pipeline code i\n[…]\nresolve their data from input_folder/ exclusively;\n   carrying sample_data/ is how synthetic values end up in production\n   outputs.\n\nReinforced in the \"Template data is for examples only\" subsection.",
          "is_bot": false,
          "headline": "AGENTS.md: forbid forking Track 1; exclude sample_data when forking T…",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-04T07:54:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ba17ed7525373131b352b62e70ca4fb49be115d3",
          "body": "…ptions\n\n- Sign-in: add a \"Signed In! Click Here to Continue\" modal that\n  shows once after a fresh sign-in (gated by a localStorage\n  vf_signin_pending flag set when startSignIn runs). Modal is\n  dismissed by clicking the button — IDE then renders normally.\n- Revert: removed the \"+ Folder\" button n\n[…]\nw Folder\" → \"Add Folder\" and \"New File\"\n  → \"Add File\" so they read consistently with the existing\n  \"Add Data\" option above them.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "0.2.4: post-sign-in modal + revert + Folder button + rename context o…",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-04T07:52:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ef14916eacf16a2f1baae839c533de8bb43abd25",
          "body": "…layout",
          "is_bot": false,
          "headline": "Restructure geo_dashboard + trend_analytics_dashboard into app_core/ …",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-04T07:06:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e66b02f6a43fe09c813eb8f1d41e0539f8bcd7af",
          "body": "The new-folder modal was already wired in App.jsx — it just had no\nvisible trigger. Adds a button next to Build that opens it.\n\n(In-tree right-click → New Folder also still works for creating\nnested folders inside the existing tree.)\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "0.2.3: expose \"+ Folder\" button next to Build in top bar",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-04T07:04:02Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2e76c1ce6d6e76a0849b0e9141e37ee18325df05",
          "body": "Two changes to src/vibefoundry/profiler.py:\n\n1) Process chunks in parallel via ThreadPoolExecutor (2-4 workers\n   based on CPU count). Polars itself uses all cores within each\n   chunk, but only one chunk ran at a time previously. Pipelining\n   overlaps I/O and compute across chunks.\n\n2) Eliminate t\n[…]\nmbined: scanning a multi-GB Parquet/CSV is meaningfully faster\non first open. Subsequent opens were already fast (cached profile).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "0.2.2: 3-5× faster large-file profiling",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-04T06:59:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6b24fc01097b2273b0567a9e36f66001a3796a83",
          "body": null,
          "is_bot": false,
          "headline": "Bump to 0.2.1: FileTree expand fix",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-04T06:53:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2b3e40fed5adeb23f88651b826e532a0801e87dd",
          "body": "Bug: collapsing a folder and re-expanding it would render all\ndescendants expanded too. Caused by expandToPath (fired when files\nappear in the tree) leaving stale entries in expandedPaths for\ndescendant folders that the user never explicitly expanded.\n\nFix: every toggle (expand or collapse) of a pat\n[…]\ndescendant entries from expandedPaths. Matches standard\nfile-explorer behaviour where collapse + re-expand loses descendant\nstate.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "FileTree: clear descendant expansion state on every toggle",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-04T06:52:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "feef87341e2bb48dfd1d9da9b8301e9fd5494a7b",
          "body": "Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Update templates/AGENTS.md",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-04T05:48:50Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "42960b626b3e141f823ed8a265005ac8533187b9",
          "body": "When Build cascades the templates/ tree into <project>/app_folder/\ntemplates/, the file watcher fires the addedPaths handler which\nhistorically called expandToPath() on every newly-discovered file.\nThat recursively expanded every ancestor — turning templates/ into\na fully-expanded library that burie\n[…]\neta_data exclusion). Users can still click the\ntemplates/ folder to expand it manually if they want to inspect a\nspecific starter.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "FileTree: never auto-expand templates/ when files appear in it",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-04T05:47:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "50e43e6762eac75ec0ea13c3feb6b87fb17ad7a2",
          "body": "Architecture change to remove the [Development] prefix from verification\nemails (which was a Clerk Dev limitation, hard to escape on a localhost\ndesktop app). The IDE now uses the same redirect-based pattern as gh,\nvercel, wandb CLIs.\n\nFlow:\n1. User clicks \"Sign in\" → IDE backend generates a CSRF st\n[…]\n).\n\nVersion bump 0.1.310 → 0.2.0 (semver: meaningful auth architecture\nchange, not backwards compatible with old Dev-keyed users).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.2.0: replace Clerk frontend with delegated auth via vibefoundry.ai",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-04T05:02:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "21fbe9ea0c1e067d821a29d45f827194db7a4f90",
          "body": "Templates now land at <project>/app_folder/templates/<name>/ instead\nof <project>/app_folder/<name>/. Keeps the starter content visually\nand organizationally separate from scripts the user writes themselves.\nAGENTS.md continues to be hoisted to the project root after cascade.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Build: cascade templates into app_folder/templates/ subfolder",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-04T04:29:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0578adfd6c254acf2cd4a4fe51cfbb0db65b3ad0",
          "body": "Templates added:\n- data_pipeline/    — multi-step Polars pipeline with sample parquet\n- geo_dashboard/    — Vite + Leaflet geographic dashboard starter\n- trend_analytics_dashboard/ — Vite trend analytics starter\n\nCascade behaviour change:\n- Templates now land inside <project>/app_folder/<template_na\n[…]\ns it where it expects.\n\nVersions:\n- pyproject.toml: 0.1.309 → 0.1.310\n- src/vibefoundry/__init__.py: 0.1.302 → 0.1.310 (was stale)\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add app templates; cascade into app_folder/; bump to 0.1.310",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-04T04:27:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1238ac894ebd1ff7fff12e86685ff5566d2aed83",
          "body": "Previously the cascade only walked the top level of templates/ and\nskipped any subfolders. Now it recurses through directories, mirroring\nthe structure into dest_root. Lets you ship app starter templates as\nfolders (e.g., templates/streamlit_dashboard/, templates/rag_app/)\nand have every Build pull them into the user's project intact.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Build: cascade templates/ recursively, preserving subfolder structure",
          "author_name": "vibefoundry",
          "author_login": "vibefoundry",
          "committed_at": "2026-05-04T04:20:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        }
      ],
      "releases_count": 0,
      "commits_last_year": 211,
      "latest_release_at": null,
      "latest_release_tag": null,
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 14,
      "days_since_latest_release": null,
      "mean_days_between_releases": null
    },
    "community": {
      "has_readme": true,
      "has_license": false,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 28,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "vibefoundry",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "ide",
            "data-science",
            "scripts",
            "codespace",
            "Development Status :: 4 - Beta",
            "Environment :: Web Environment",
            "Intended Audience :: Developers",
            "Intended Audience :: Science/Research",
            "License :: OSI Approved :: MIT License",
            "Operating System :: OS Independent",
            "Programming Language :: Python :: 3",
            "Programming Language :: Python :: 3.10",
            "Programming Language :: Python :: 3.11",
            "Programming Language :: Python :: 3.12",
            "Programming Language :: Python :: 3.9",
            "Topic :: Scientific/Engineering",
            "Topic :: Software Development :: User Interfaces"
          ],
          "ecosystem": "pypi",
          "matches_repo": true,
          "registry_url": "https://pypi.org/project/vibefoundry/",
          "is_deprecated": false,
          "latest_version": "0.4.2",
          "repository_url": "https://github.com/vibefoundry/vibefoundry-python-lib",
          "versions_count": 253,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 5422,
          "first_published_at": "2026-02-09T14:16:29.073308Z",
          "latest_published_at": "2026-08-01T03:23:29.175204Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 0,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_stars": 0,
        "collected_at": null
      },
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [],
      "largest_source_bytes": 105899,
      "source_files_sampled": 30,
      "oversized_source_files": 2,
      "agent_instruction_files": [
        "archived md files/AGENTS.md"
      ],
      "agent_instruction_max_bytes": 75665
    },
    "dependencies": {
      "manifests": [
        "frontend/package.json",
        "pyproject.toml"
      ],
      "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",
        "pypi"
      ],
      "dependencies": [
        {
          "name": "@clerk/clerk-react",
          "manifest": "frontend/package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.61.6"
        },
        {
          "name": "@codemirror/commands",
          "manifest": "frontend/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.10.1"
        },
        {
          "name": "@codemirror/lang-css",
          "manifest": "frontend/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.3.1"
        },
        {
          "name": "@codemirror/lang-html",
          "manifest": "frontend/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.4.11"
        },
        {
          "name": "@codemirror/lang-javascript",
          "manifest": "frontend/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.2.4"
        },
        {
          "name": "@codemirror/lang-json",
          "manifest": "frontend/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.0.2"
        },
        {
          "name": "@codemirror/lang-markdown",
          "manifest": "frontend/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.5.0"
        },
        {
          "name": "@codemirror/lang-python",
          "manifest": "frontend/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.2.1"
        },
        {
          "name": "@codemirror/language",
          "manifest": "frontend/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.12.1"
        },
        {
          "name": "@codemirror/state",
          "manifest": "frontend/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.5.4"
        },
        {
          "name": "@codemirror/theme-one-dark",
          "manifest": "frontend/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.1.3"
        },
        {
          "name": "@codemirror/view",
          "manifest": "frontend/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.39.12"
        },
        {
          "name": "@tanstack/react-table",
          "manifest": "frontend/package.json",
          "ecosystem": "npm",
          "version_constraint": "^8.21.3"
        },
        {
          "name": "@xterm/addon-canvas",
          "manifest": "frontend/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.7.0"
        },
        {
          "name": "@xterm/addon-fit",
          "manifest": "frontend/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.10.0"
        },
        {
          "name": "@xterm/xterm",
          "manifest": "frontend/package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.5.0"
        },
        {
          "name": "chart.js",
          "manifest": "frontend/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.5.1"
        },
        {
          "name": "papaparse",
          "manifest": "frontend/package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.5.3"
        },
        {
          "name": "react",
          "manifest": "frontend/package.json",
          "ecosystem": "npm",
          "version_constraint": "^19.2.0"
        },
        {
          "name": "react-dom",
          "manifest": "frontend/package.json",
          "ecosystem": "npm",
          "version_constraint": "^19.2.0"
        },
        {
          "name": "react-json-view-lite",
          "manifest": "frontend/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.5.0"
        },
        {
          "name": "react-markdown",
          "manifest": "frontend/package.json",
          "ecosystem": "npm",
          "version_constraint": "^10.1.0"
        },
        {
          "name": "react-syntax-highlighter",
          "manifest": "frontend/package.json",
          "ecosystem": "npm",
          "version_constraint": "^16.1.0"
        },
        {
          "name": "react-window",
          "manifest": "frontend/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.2.6"
        },
        {
          "name": "xlsx",
          "manifest": "frontend/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.18.5"
        },
        {
          "name": "fastapi",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.100.0"
        },
        {
          "name": "uvicorn",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.23.0"
        },
        {
          "name": "polars-lts-cpu",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.0.0"
        },
        {
          "name": "pyarrow",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=14.0.0"
        },
        {
          "name": "pandas",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2.0.0"
        },
        {
          "name": "openpyxl",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=3.1.0"
        },
        {
          "name": "fastexcel",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.10"
        },
        {
          "name": "xlsx2html",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.6"
        },
        {
          "name": "websockets",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=11.0.0"
        },
        {
          "name": "httpx",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.25.0"
        },
        {
          "name": "xlsx2csv",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.8.0"
        },
        {
          "name": "python-multipart",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.0.6"
        },
        {
          "name": "watchdog",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=3.0.0"
        },
        {
          "name": "python-dateutil",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2.8.0"
        },
        {
          "name": "truststore",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.9"
        }
      ],
      "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": 0,
        "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": "vibefoundry",
          "commits": 138,
          "avatar_url": "https://avatars.githubusercontent.com/u/214882911?v=4"
        },
        {
          "type": "User",
          "login": "boostergpt",
          "commits": 78,
          "avatar_url": "https://avatars.githubusercontent.com/u/191929723?v=4"
        }
      ],
      "contributors_sampled": 2,
      "top_contributor_share": 0.639
    },
    "quality_signals": {
      "has_ci": false,
      "has_tests": false,
      "ci_workflows": [],
      "has_docs_dir": false,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "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": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": null,
            "reason": "no workflows found",
            "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": 0,
            "reason": "license file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 0,
            "reason": "project was created within the last 90 days. Please review its contents carefully",
            "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": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "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": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": null,
            "reason": "No tokens found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "22 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "36aea3d168cd7339ac57458904bee1ae15ef1e5a",
        "ran_at": "2026-08-01T03:26:02Z",
        "aggregate_score": 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-08-01T03:23:45Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": null,
      "ci_last_conclusion": null,
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/vibefoundry/vibefoundry-python-lib",
    "host": "github.com",
    "name": "vibefoundry-python-lib",
    "owner": "vibefoundry"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "at_risk",
      "name": "Overall health",
      "note": "The weighted overall 28 is calibrated to 22 on the published index scale (record calibration 2026-08-02).",
      "notes": [
        {
          "code": "overall_calibration",
          "params": {
            "raw": 28,
            "calibrated": 22,
            "calibration": "2026-08-02"
          }
        }
      ],
      "value": 22,
      "inputs": {
        "security": 10,
        "vitality": 39,
        "community": 25,
        "governance": 33,
        "calibration": "2026-08-02",
        "engineering": 21,
        "ai_readiness": 57,
        "weighted_overall_raw": 28
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "weak",
        "name": "Vitality",
        "value": 39,
        "weight": 0.21,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 64,
            "inputs": {
              "commits_last_year": 211,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 14
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "14/52 weeks with commits",
                "points": 9.7,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 14
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "211 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 211
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "critical",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 1,
            "inputs": {
              "releases_count": 0
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "no releases published",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_releases_published",
                    "params": {}
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "no releases",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_releases",
                    "params": {}
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "no releases",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_releases",
                    "params": {}
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "exceptional",
            "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": 25,
        "weight": 0.17,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 0,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "0 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "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": "at_risk",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 25,
            "inputs": {
              "has_readme": true,
              "has_license": false,
              "readme_badges": null,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "readme_badge_services": [],
              "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": "no license file detected",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "license_absent",
                    "params": {}
                  }
                ],
                "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": [
                "vibefoundry"
              ],
              "dependents": null,
              "ecosystems": "pypi",
              "total_downloads": null,
              "monthly_downloads": 5422
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "5,422 downloads/month across pypi",
                "points": 49.8,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 5422,
                      "ecosystems": "pypi"
                    }
                  }
                ],
                "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": 33,
        "weight": 0.23,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 20,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 2,
              "top_contributor_share": 0.639
            },
            "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 64% of commits",
                "points": 8.1,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 64
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "2 contributors",
                "points": 2.7,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "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, Newcomer PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution",
                    "pr_acceptance",
                    "newcomer_pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 1,
            "inputs": {
              "merged_prs": 0,
              "open_issues": 0,
              "closed_issues": 0,
              "prs_merged_7d": null,
              "prs_decided_7d": null,
              "prs_merged_30d": null,
              "prs_decided_30d": null,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 0,
              "first_time_authors_30d": null,
              "first_time_prs_merged_30d": null,
              "first_time_prs_decided_30d": null
            },
            "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": 42
              },
              {
                "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": 30
              },
              {
                "key": "newcomer_pr_acceptance",
                "name": "Newcomer PR acceptance",
                "detail": "no first-time contributor's PR decided in 30d",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_newcomer_prs",
                    "params": {
                      "days": 30
                    }
                  }
                ],
                "max_points": 13
              },
              {
                "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": 28,
            "inputs": {
              "followers": 1,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "vibefoundry",
              "public_repos": 12,
              "account_age_days": 422
            },
            "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": "1 followers of vibefoundry",
                "points": 2.2,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 1,
                      "login": "vibefoundry"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "12 public repos, account ~1 yr old",
                "points": 10.4,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 12
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 1
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "exceptional",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "vibefoundry"
              ],
              "ecosystems": "pypi",
              "any_deprecated": false,
              "min_days_since_publish": 0
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on pypi",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "pypi"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 0 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "253 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 253
                    }
                  }
                ],
                "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": "at_risk",
        "name": "Engineering Quality",
        "value": 21,
        "weight": 0.19,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "critical",
            "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": 1,
            "inputs": {
              "has_ci": false,
              "has_tests": false,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": false,
              "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": 0,
                "status": "missed",
                "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": "critical",
        "name": "Security",
        "value": 10,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "critical",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Dangerous-Workflow, Packaging, Signed-Releases, Token-Permissions. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "dangerous_workflow",
                    "packaging",
                    "signed_releases",
                    "token_permissions"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 10,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 13,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 5,
              "scorecard_aggregate": 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 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no workflows found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "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 not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "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 0",
                "points": 0,
                "status": "missed",
                "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": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "No tokens found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "22 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          }
        ],
        "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": 57,
        "weight": 0.04,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.85,
              "agent_instruction_files": [
                "archived md files/AGENTS.md"
              ],
              "agent_instruction_max_bytes": 75665
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "archived md files/AGENTS.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "archived md files/AGENTS.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": "85 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 85,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "weak",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 38,
            "inputs": {
              "has_nix": false,
              "has_tests": false,
              "lockfiles": [
                "package-lock.json"
              ],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [
                "Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0.81,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Makefile"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "81 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 81,
                      "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 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "moderate",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 51,
            "inputs": {
              "primary_language": "JavaScript",
              "largest_source_bytes": 105899,
              "source_files_sampled": 30,
              "oversized_source_files": 2
            },
            "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": "2/30 source files over 60KB",
                "points": 51.3,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 30,
                      "oversized": 2
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? Carries a deliberately small weight: agent tooling is a real maintenance signal, but its absence must never gate the top of the scale (calibration saturates at raw 91, so 100/100 remains reachable with AI Readiness at zero)."
      }
    ],
    "classification": {
      "labels": [
        "library",
        "network-service",
        "web-ui"
      ],
      "scores": {
        "web-ui": 4,
        "library": 8,
        "network-service": 4
      },
      "primary": "library",
      "evidence": [
        {
          "tier": "distribution",
          "label": "library",
          "source": "registry:pypi",
          "weight": 6
        },
        {
          "tier": "dependencies",
          "label": "network-service",
          "source": "dep:fastapi",
          "weight": 4
        },
        {
          "tier": "dependencies",
          "label": "web-ui",
          "source": "dep:react-dom",
          "weight": 4
        },
        {
          "tier": "description",
          "label": "library",
          "source": "description:library",
          "weight": 2
        }
      ],
      "artifacts": [],
      "confidence": "medium",
      "host_extension": false,
      "runs_as_process": true,
      "consumed_by_code": true
    },
    "metrics_version": "2.3.1"
  },
  "warnings": [
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
    "deps.dev does not index pypi:vibefoundry@0.4.2; advisories assessed against the repository dependency graph instead"
  ],
  "report_type": "repository",
  "generated_at": "2026-08-01T03:26:06.964687Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/v/vibefoundry/vibefoundry-python-lib.svg",
  "full_name": "vibefoundry/vibefoundry-python-lib",
  "license_state": "absent",
  "license_spdx": null
}

评分是信号,而非担保。 评分反映的是 GitHub 上公开可见的实践——不是代码审计,也不是安全保证。

缺失数据将被剔除并重新归一化权重,绝不按零分计。方法论已版本化并公开:指标 v2.3.1、模式 v0.27.0—— 完整方法论 · 指标知识库.

单项结果在整体记录中的位置: 汇总统计PyPI.