公开记录
软件健康报告模式 0.27.0 · 指标 1.13.0 · 2026-07-23 11:36 UTC

ashaychangwani / imprint

Record a browser workflow once, get a deterministic MCP tool your AI agent can call. Zero tokens at runtime. Postman for AI agents.

TypeScriptMIT★ 18 星标⑂ 1 复刻始于 2026年5月在 GitHub 上查看 ↗

ashaychangwani/imprint 的健康指数为 100 分中的 57 分,处于「中等」区间。 其得分最高的类别是Engineering Quality(81/100),最低的是Security(31/100)。 最近一次更新在今天。 近期的大部分工作由 1 位贡献者完成。

57
总分 / 100
中等

软件健康指数

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

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

评分画像

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

所有权

Ashay Changwani个人账户
15 关注者113 个公开仓库始于 2017年6月

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

软件包生态系统

注册表软件包版本月下载量版本数最近发布
npmimprint-mcp0.6.52,525245 天前

按类别列示的指标

活力

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

73良好 · 占总体的 22%
评分方式
36/36推送新近度 — 最近一次推送于 0 天前
8.3/36提交节奏 — 52 周中有 12 周有提交
18/18提交量 — 最近一年 282 次提交
0/10OpenSSF Scorecard:Maintained — project was created within the last 90 days. Please review its contents carefully
所用输入
commits_last_year282
human_commit_share1
days_since_last_push0
active_weeks_last_year12

发布纪律

90优秀
评分方式
27/27有发布版本 — 已发布 25 个发布版本
36/36发布时效 — 最近一次发布版本于 5 天前
27/27发布节奏 — 约每 2.4 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — Project has not signed or included provenance with any releases.
所用输入
releases_count25
latest_release_tagv0.6.5
releases_from_tags
days_since_latest_release5
mean_days_between_releases2.4

社区与采用

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

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

社区健康

70良好
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(MIT)
18/18CONTRIBUTING 指南
0/13.5行为准则
0/7.2议题模板
0/6.3PR 模板
所用输入
has_readme
has_license
has_contributing
has_issue_template
has_code_of_conduct
has_pull_request_template
评分方式
45.4/80月度下载量 — npm 合计每月 2,525 次下载
0/20注册表被依赖数 — 该生态系统不报告此项
所用输入
packagesimprint-mcp
dependents
ecosystemsnpm
total_downloads
monthly_downloads2,525
已排除计分(无数据或不适用):注册表被依赖数。 其余权重已重新归一化。

可持续性与治理

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

48存在风险 · 占总体的 24%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
0/22.5提交分布 — 头号贡献者编写了 100% 的提交
1.4/13.5贡献者广度 — 1 位贡献者
0/10OpenSSF Scorecard:Contributors — project has 0 contributing companies or organizations -- score normalized to 0
所用输入
bus_factor1
contributors_sampled1
top_contributor_share1
评分方式
9.3/46.8议题解决 — 20% 的议题已关闭
35.6/38.3PR 接受 — 已裁定的 PR 中 108/116 已合并
0/15OpenSSF Scorecard:Code-Review — Found 0/30 approved changesets -- score normalized to 0
所用输入
merged_prs108
open_issues4
closed_issues1
issue_closed_ratio0.2
closed_unmerged_prs8
评分方式
10/30所有权背书 — 个人(用户)账户
0/20已验证域名 — 不适用于个人账户
8.7/25所有者影响力 — ashaychangwani 有 15 位关注者
25/25既往记录 — 113 个公开仓库,账户约 9 年
所用输入
followers15
owner_typeUser
is_verified
owner_loginashaychangwani
public_repos113
account_age_days3,314
已排除计分(无数据或不适用):已验证域名。 其余权重已重新归一化。
评分方式
25/25已发布且可解析 — npm 上有 1 个软件包
35/35发布时效 — 最近一次发布于 5 天前
20/20版本历史 — 24 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagesimprint-mcp
ecosystemsnpm
any_deprecated
min_days_since_publish5

工程质量

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

81良好 · 占总体的 20%

工程实践

68中等
评分方式
24/24CI 工作流 — 3 个工作流
24/24存在测试
0/16Linter 配置
0/9.6Pre-commit 钩子
0/6.4.editorconfig
20/20OpenSSF Scorecard:CI-Tests — 17 out of 17 merged PRs checked by a CI test -- score normalized to 10
所用输入
has_ci
has_tests
has_editorconfig
has_linter_config
has_precommit_config

文档

100优秀
评分方式
30/30README
25/25文档目录
15/15文档 / 主页站点 — https://github.com/ashaychangwani/imprint
10/10仓库描述
10/10主题标签 — 9 个主题标签
10/10Wiki
所用输入
topicsai-agents, browser-automation, bun, claude, llm, mcp, mcp-server, typescript, web-scraping
has_wiki
homepagehttps://github.com/ashaychangwani/imprint
has_readme
has_docs_dir
has_description

安全

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

31存在风险 · 占总体的 16%

安全态势

31存在风险
评分方式
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
2.5/2.5CI-Tests — 17 out of 17 merged PRs checked by a CI test -- score normalized to 10
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
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5许可证 — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
5/5Security-Policy — security policy file detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 35 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate3.1

AI 就绪度

该仓库在多大程度上具备与 AI 编码代理协同开发与维护的条件?这是一枚独立的实验性徽章——权重为 0.0,因此单独呈现,不影响总体健康评分。

66中等 · 占总体的 0%
评分方式
45/45代理指令 — AGENTS.md, CLAUDE.md
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 100 次人类提交中有 99 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share0.99
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes10,645
评分方式
0/18一条命令的引导启动
22/22自动化测试
0/11Lint / 格式化配置
11/11静态类型检查 — tsconfig.json
0/10可复现环境
10/10已体现的代理实践 — 最近 100 次提交中有 54 次由代理编写或署名代理
0/8自动化维护 — 未观察到自动依赖更新
0/10OpenSSF Scorecard:Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
所用输入
has_nix
has_tests
lockfiles
has_dockerfile
typed_language
bootstrap_files
has_devcontainer
has_linter_config
typecheck_configstsconfig.json
agent_commit_share0.54
toolchain_manifests
dependency_bot_commit_share0
评分方式
45/45可类型检查的代码 — TypeScript(静态类型)
52.6/55可控的文件大小 — 采样的 249 个源文件中有 11 个超过 60KB
所用输入
primary_languageTypeScript
largest_source_bytes189,362
source_files_sampled249
oversized_source_files11
评分方式
0/40API 模式(OpenAPI/GraphQL/proto)
20/20MCP 服务器
40/40可运行示例 — examples
所用输入
example_dirsexamples
has_mcp_signal
api_schema_files

关键数据

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

数据采集警告

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository
  • deps.dev does not index npm:imprint-mcp@0.6.5; advisories assessed against the repository dependency graph instead

更多细节

OpenSSF Scorecard 3.1 / 10
3.1综合

来自开源项目 OpenSSF Scorecard 的独立、工具无关的安全评估。每项检查奖励的是安全实践本身,而非特定供应商的工具。Scorecard 无法判定的检查项标记为 不适用,并从安全评分中剔除(绝不按零分计)。Scorecard v5.5.0 · 2026-07-23 11:36 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
10CI-Tests17 out of 17 merged PRs checked by a CI test -- score normalized to 10
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
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
10Security-Policysecurity policy file detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities35 existing vulnerabilities detected
直接依赖 29
注册表软件包版本约束清单文件
npm@anthropic-ai/sdk^0.52.0package.json
npm@arizeai/phoenix-otel^1.0.2package.json
npm@clack/prompts^1.3.0package.json
npm@modelcontextprotocol/sdk^1.0.0package.json
npm@napi-rs/keyring^1.3.0package.json
npm@noble/hashes^2.2.0package.json
npm@opentelemetry/api^1.9.1package.json
npmchrome-remote-interface^0.33.0package.json
npmenv-paths^3.0.0package.json
npmlibsodium-wrappers^0.8.4package.json
npmnode-cron^3.0.3package.json
npmplaywright^1.49.0package.json
npmplaywright-extra^4.3.6package.json
npmpuppeteer-extra-plugin-stealth^2.11.2package.json
npmredactum^1.1.0package.json
npmsemver^7.8.4package.json
npmtldts^7.4.8package.json
npmyaml^2.8.4package.json
npmzod^3.24.0package.json
npm@vitejs/plugin-react6.0.1web/package.json
npmhighlight.js^11.11.1web/package.json
npmreact19.2.6web/package.json
npmreact-dom19.2.6web/package.json
npmreact-markdown^10.1.0web/package.json
npmreact-router-dom^7.15.0web/package.json
npmrehype-highlight^7.0.2web/package.json
npmrehype-slug^6.0.0web/package.json
npmremark-gfm^4.0.1web/package.json
npmvite8.0.12web/package.json
全部依赖 未采集

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

原始 JSON 报告 机器可读
{
  "data": {
    "repo": {
      "topics": [
        "ai-agents",
        "browser-automation",
        "bun",
        "claude",
        "llm",
        "mcp",
        "mcp-server",
        "typescript",
        "web-scraping"
      ],
      "is_fork": false,
      "size_kb": 3780,
      "has_wiki": true,
      "homepage": "https://github.com/ashaychangwani/imprint",
      "languages": {
        "CSS": 14106,
        "HTML": 513,
        "Shell": 7972,
        "JavaScript": 49414,
        "TypeScript": 3120767
      },
      "pushed_at": "2026-07-23T10:38:13Z",
      "created_at": "2026-05-03T21:18:37Z",
      "owner_type": "User",
      "updated_at": "2026-07-18T07:17:25Z",
      "description": "Record a browser workflow once, get a deterministic MCP tool your AI agent can call. Zero tokens at runtime. Postman for AI agents.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript"
      ]
    },
    "owner": {
      "blog": "https://prospify.app",
      "name": "Ashay Changwani",
      "type": "User",
      "login": "ashaychangwani",
      "company": null,
      "location": null,
      "followers": 15,
      "avatar_url": "https://avatars.githubusercontent.com/u/29693329?v=4",
      "created_at": "2017-06-25T18:40:50Z",
      "is_verified": null,
      "public_repos": 113,
      "account_age_days": 3314
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.6.5",
          "kind": "patch",
          "published_at": "2026-07-18T02:28:49Z"
        },
        {
          "tag": "v0.6.4",
          "kind": "patch",
          "published_at": "2026-07-17T03:10:52Z"
        },
        {
          "tag": "v0.6.3",
          "kind": "patch",
          "published_at": "2026-07-16T01:26:44Z"
        },
        {
          "tag": "v0.6.2",
          "kind": "patch",
          "published_at": "2026-07-15T02:03:33Z"
        },
        {
          "tag": "v0.6.1",
          "kind": "patch",
          "published_at": "2026-07-13T22:05:11Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-07-09T23:14:15Z"
        },
        {
          "tag": "v0.5.1",
          "kind": "patch",
          "published_at": "2026-07-01T02:43:16Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-06-26T19:40:54Z"
        },
        {
          "tag": "v0.4.11",
          "kind": "patch",
          "published_at": "2026-06-26T12:38:06Z"
        },
        {
          "tag": "v0.4.10",
          "kind": "patch",
          "published_at": "2026-06-26T11:57:01Z"
        },
        {
          "tag": "v0.4.9",
          "kind": "patch",
          "published_at": "2026-06-26T09:55:31Z"
        },
        {
          "tag": "v0.4.8",
          "kind": "patch",
          "published_at": "2026-06-26T08:56:50Z"
        },
        {
          "tag": "v0.4.7",
          "kind": "patch",
          "published_at": "2026-06-25T00:29:20Z"
        },
        {
          "tag": "v0.4.6",
          "kind": "patch",
          "published_at": "2026-06-22T23:41:05Z"
        },
        {
          "tag": "v0.4.5",
          "kind": "patch",
          "published_at": "2026-06-22T22:00:51Z"
        },
        {
          "tag": "v0.4.4",
          "kind": "patch",
          "published_at": "2026-06-20T05:53:22Z"
        },
        {
          "tag": "v0.4.3",
          "kind": "patch",
          "published_at": "2026-06-19T02:45:01Z"
        },
        {
          "tag": "v0.4.2",
          "kind": "patch",
          "published_at": "2026-06-18T23:18:29Z"
        },
        {
          "tag": "v0.4.1",
          "kind": "patch",
          "published_at": "2026-06-18T20:58:16Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-06-17T07:18:05Z"
        },
        {
          "tag": "v0.3.1",
          "kind": "patch",
          "published_at": "2026-06-07T23:35:45Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-06-06T21:42:06Z"
        },
        {
          "tag": "v0.2.1",
          "kind": "patch",
          "published_at": "2026-05-27T07:34:46Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-05-14T11:06:47Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2026-05-05T08:55:46Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "a16fdfc4a50a049a52b6adffbaea588c21d2c384",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): v0.6.5",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-07-18T02:28:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "848004b15a8f8b6761e866ef5b1572829552e1f2",
          "body": "* feat(teach): make tool selection dependency-aware\n\n* refactor(teach): simplify dependency-aware selection",
          "is_bot": false,
          "headline": "feat(teach): make tool selection dependency-aware (#123)",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-07-18T02:05:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "def4991d4efeb916a4a876f50114697d70c67e02",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): v0.6.4",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-07-17T03:10:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "959cf8d5402a89e92c8c09f57e08433400f79688",
          "body": "* fix(record): recover missing React Flight bodies\n\n* chore(skills): add PR review convergence workflow\n\n* fix(record): tighten React Flight response recovery\n\nKeep streamed recovery narrowly bounded to missing React Flight bodies, preserve\npriority capacity under mixed load, and route header-only Flight responses through\nstructural redaction. Remove benchmark artifacts and unrelated behavioral changes.",
          "is_bot": false,
          "headline": "fix(record): recover missing React Flight bodies (#122)",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-07-17T02:47:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "200389d1627ea87f56d625c7fcfcd30db7b66bee",
          "body": "* fix(tracing): delegate model cost calculation to Phoenix\n\n* fix(tracing): preserve Phoenix cost accuracy\n\n* fix(tracing): handle delayed and retried usage\n\n* fix(tracing): resolve legacy unpriced models\n\n* fix(tracing): distinguish unresolved Phoenix costs\n\n* fix(tracing): preserve settled span costs",
          "is_bot": false,
          "headline": "fix(tracing): delegate model cost calculation to Phoenix (#121)",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-07-16T11:07:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4bc994583cb1a9fb9584fcf55eae61f5ee895d8d",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): v0.6.3",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-07-16T01:25:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c91c9dfde80f769cb0ee1bc54fd9c4e909167a27",
          "body": "* fix(audit): scope headless audits to eligible tools\n\nPrevent unattended audits from initiating authentication that can require human continuation. Preserve audit coverage diagnostics for skipped and detected-but-unemitted tools without affecting the accuracy denominator.\n\n* feat(teach): add tool-s\n[…]\nbudget, bound incomplete verifier runs separately, and require a completed infrastructure-only report before explicit unverified acceptance. Use the independent Terra verifier for both compiler paths.",
          "is_bot": false,
          "headline": "fix(teach): harden reteach verification and audits (#120)",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-07-16T00:43:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6e608188d2bc505f03135e5985902310fc42987f",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): v0.6.2",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-07-15T02:02:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cc4e2d1252c0ca5682b77934bc546648c2a119c7",
          "body": "* feat(teach): add agentic live verification\n\nDelegate final integration judgment to an independent verifier with\ndurable evidence, real-time logs, backend preparation, and compiler\nfeedback loops.\n\nAdd generic browser navigation interactions, resilient reteach phase\nselection, and backend-cache preservation.\n\n* fix(teach): harden agentic verification lifecycle\n\n* fix(audit): keep evaluation types internal",
          "is_bot": false,
          "headline": "feat(teach): add agentic live verification (#119)",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-07-15T02:00:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "432661b9958e97d84ad0e9c1c7f8cdc89fd5acc4",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): v0.6.1",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-07-13T22:04:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0ea44e5a8acb9985a30cb223ad8c76172631ccaf",
          "body": "* feat(auth): support checkpointed Codex compilation\n\nRefresh the laddered auth compiler on v0.6.0, keep live browser state\nacross 2FA phases, and require recording-grounded completion without a\nplaybook fallback.\n\n* feat(llm): add gpt-5.6 Codex models\n\n* feat(auth): compile recording-grounded actio\n[…]\nh): skip browser-only form checks in CI\n\n* test(backends): isolate fetch integration coverage\n\n* test(backends): avoid browser bootstrap in cache test\n\n* test(backends): stabilize memo timing coverage",
          "is_bot": false,
          "headline": "feat(auth): compile recording-grounded auth actions with Codex (#118)",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-07-13T22:02:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a30e12fa5f64571b10b4badc6e704aa350987bbc",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): v0.6.0",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-07-09T23:13:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "98ddbe673c5bc374943ce20e5099f924d14dcd2d",
          "body": "Squash merge PR #116 after PR #115 landed.",
          "is_bot": false,
          "headline": "feat(examples): refresh Google Hotels and Southwest tools",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-07-09T23:10:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ed6b92e79578b1f1779046ed5e73d751a677dc8f",
          "body": "Squash merge PR #115.",
          "is_bot": false,
          "headline": "fix(teach): harden diagnostics and browser-backed replay",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-07-09T23:07:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ebd2e91e16da31173e201cf865ffde896ed4d4ff",
          "body": "* fix(audit): strengthen parameter coverage and token contracts\n\n* feat(examples): refresh google flights tools\n\n* chore(release): v0.5.1\n\n* docs(skills): capture google flights audit workflows\n\n* fix(audit): honor token and parameter audit signals",
          "is_bot": false,
          "headline": "fix(audit): strengthen parameter coverage and token contracts (#114)",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-07-01T03:09:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "898ae94094a3a3fe34acd9eaf400139283fbf188",
          "body": "…ens (#111)\n\ngoogle-flights compiled 0/5 from a clean recording. The root cause was a\nverifier regression in the plan-time dependency contract: contractedInputGate\nsearched the JSON-escaped workflow text using the *unescaped* literal as the\nneedle, so any static header whose value contains double-qu\n[…]\nnner now contracts f.sid/bl as browser_state for all five tools.\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(teach): unblock google-flights compile + contract URL session tok…",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-30T09:30:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "969ce4049b4949cbb723b64e0adc563791ae712b",
          "body": "…(#113)\n\nA parallel audit of the codebase surfaced eight places where core logic was\ncoupled to a single site, vendor, or wire format rather than deriving behavior\ngenerically. Overfitting like this silently mis-handles every other site (a\ndecoder keyed to one envelope shape, an endpoint-grouping re\n[…]\nck it), so a live Southwest run is the\nfinal confirmation there.\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: generalize site-specific code in core (remove overfitting) …",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-30T09:21:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "41638cab221a9328e7da521b1546c3435230c2ef",
          "body": "The compile-time backend ladder runs cdp-replay inside probe subprocesses\nthat each launch a real Chrome. When a probe finished by calling\nprocess.exit(0) before the cdp pool's 15s idle-close timer fired, the Chrome\nwas never closed — and across a full `imprint teach` run these orphans\naccumulated (\n[…]\nogle-flights re-teach finished with a\nChrome process count of 0.\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ladder): kill orphaned compile Chrome processes on exit (#112)",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-30T06:24:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f61fa943aa13df4cf24aee2c6a8ded93cee0dc6d",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): v0.5.0",
          "author_name": "Ashay Changwani",
          "author_login": null,
          "committed_at": "2026-06-26T19:40:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5c3cf5749d84627092fb4cf0e83cdc302f4a7513",
          "body": "…session continuity (#105)\n\n* feat(auth): laddered authenticate tools with structural 2FA + serialized-session attempt\n\nMake `imprint teach` detect a site's login requirement, compile an\n`authenticate` tool BEFORE the data tools, and drive it to the 2FA\nchallenge — using whatever rung of the backend\n[…]\n Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(auth): agent-orchestrated 2FA — segmented compile + cross-phase …",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-26T19:23:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e7b1cc81951ab50dff6fe0ac33018bec565efa6c",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): v0.4.11",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-26T12:37:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1ce0bb240fc13b1589a2fea419c1921053ed37ab",
          "body": "Fix carrier-code filters by using Google Flights include slot and surface non-exhaustive search scope with available airline filters.",
          "is_bot": false,
          "headline": "fix(google-flights): encode carrier filters as includes",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-26T12:36:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cd98055359d890eb3f480b64f09a93264c1d30e0",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): v0.4.10",
          "author_name": "Ashay Changwani",
          "author_login": null,
          "committed_at": "2026-06-26T11:56:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dbfc002fac0887d762bb37fda038f42aef99055c",
          "body": "…enerated tools (#110)\n\nThe published npm package's `files` whitelist shipped src/, prompts/, and\nexamples/ but omitted tsconfig.json. On any global/npm install of imprint\n(e.g. `bun add -g imprint-mcp`), REPO_ROOT resolves to the install dir, so the\ngenerated-artifact typecheck step — typecheckArti\n[…]\nacefully when the root tsconfig is absent is tracked separately.\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(packaging): ship tsconfig.json so global installs can typecheck g…",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-26T11:54:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f746d73a9aafec9682efab5b52701c17dd6ae205",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): v0.4.9",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-26T09:55:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4517a785d9cfb1df9d383189ed7321aba822228a",
          "body": "Fix Google Flights one-way request shaping and deterministic calendar lows.",
          "is_bot": false,
          "headline": "fix(google-flights): harden one-way search and calendar prices",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-26T09:54:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b5c11ad4987af2dfa4563b7d6e9529f0eb904d3a",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): v0.4.8",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-26T08:56:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2345f399a0ed38e7a0003baa2a38641e27fd2902",
          "body": null,
          "is_bot": false,
          "headline": "fix(google-flights): reject false zeroes and keep cdp warm",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-26T08:55:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0956065203508dfda5045b08f46d20e79a67abfe",
          "body": "This reverts commit 192f595cdbf93a9f97cdb9fa65532918285864f5.",
          "is_bot": false,
          "headline": "Revert \"fix(mcp): pace warm Google Flights searches (#100)\"",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-25T00:31:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a02840c5438a5e612b73d9e7b737aaf3f69868f6",
          "body": "This reverts commit 909afe0fbb1a61cfaf5f3401e56eb4b4369a7be7.",
          "is_bot": false,
          "headline": "Revert \"chore(release): v0.4.7\"",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-25T00:31:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "909afe0fbb1a61cfaf5f3401e56eb4b4369a7be7",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): v0.4.7",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-25T00:29:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "192f595cdbf93a9f97cdb9fa65532918285864f5",
          "body": "* fix(mcp): pace warm Google Flights searches\n\nGoogle Flights can return fast empty payloads when warm CDP-backed search calls\nare issued back-to-back. Let workflows declare MCP call spacing, require the\nbrowser-minted page tokens used by the example requests, and fail malformed\nbatchexecute respons\n[…]\nrkflow metadata edits, and match the current Google Flights round-trip request classifier so generated searches do not send the stale return-leg shape.\n\n* fix(mcp): reuse browser-observed flight state",
          "is_bot": false,
          "headline": "fix(mcp): pace warm Google Flights searches (#100)",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-25T00:27:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2cd0305d7fcefcb9384d276597414f86600a3717",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): v0.4.6",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-22T23:40:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "76f85b111261284fbcb3e724601d8b5b76afa008",
          "body": "* fix(teach): keep triaged public API candidates\n\n* fix(teach): share telemetry filtering\n\n* fix(teach): narrow event telemetry detection\n\n* fix(teach): filter triage prompt events\n\n* fix(teach): satisfy deadcode export checks",
          "is_bot": false,
          "headline": "fix(teach): keep triaged public API candidates (#97)",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-22T23:38:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c5a137ecd5c4c2ce0edfe21e7b3dcf37a7b7c7be",
          "body": "…e (#99)\n\nThe LLM-based triage step runs before detect-candidates and was freely\ndropping login requests whose bodies contain ${credential.username} /\n${credential.password} placeholders. By the time detect-candidates ran\non the triaged session, the credential-bearing requests were gone — so\nthe com\n[…]\n\nprompt also gets a belt-and-suspenders bullet about credential\nplaceholders.\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(triage): preserve credential-bearing login requests through triag…",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-22T23:20:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5a720cdf933a1e95b8d4ea80dc2ecc94ec6d6f64",
          "body": "…(#98)\n\nClaude CLI ≥2.1.170 made MCP server startup non-blocking by default.\nThe compile agent was launching with zero tools because the\nimprint-compile MCP server hadn't finished connecting when the first\nmodel turn started — the model output text, ended its turn, and the\nsession completed after 1 \n[…]\nonfigured MCP servers are loaded\nand the wait applies only to our own server.\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(compile): block on MCP server connection before first model turn …",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-22T21:59:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5a0bdfb602477c4f57be321adfdf87691984556b",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): v0.4.4",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-20T05:53:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a67627c44b54c7e9299ab359286c7be69c3dba5d",
          "body": "* fix(mcp): serialize same-site tool calls\n\n* test: add backend memo timeout headroom",
          "is_bot": false,
          "headline": "fix(mcp): serialize same-site tool calls (#96)",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-20T05:52:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f034d9ba7a24050937db7ae645a6efadffb53682",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): v0.4.3",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-19T00:16:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "83959e4fc97bde9338a8ffecda03d0bba340a2c3",
          "body": "Do not persist or trust playbook as a preferred fallback unless it has a successful backend result. Bound MCP playbook fallback runtime and diagnostic screenshots so a stale DOM path cannot outlive the Hermes tool timeout.",
          "is_bot": false,
          "headline": "fix(backend): bound playbook fallback preferences (#95)",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-19T00:15:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "93829db222e582d7746f30f9cb11b9a48d3fdcd7",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): v0.4.2",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-18T23:17:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "78f827bb49ba078be1ff5e20a6f2880b9f05e994",
          "body": null,
          "is_bot": false,
          "headline": "fix(mcp): persist backend preferences (#94)",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-18T23:16:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fb879a0bed3700151e8a46a1b00d03650e3165c5",
          "body": "* feat(cli): add `imprint update` command and doctor version check\n\nAdd a self-update mechanism so users can check for and install newer\nversions without leaving the CLI. Two entry points:\n\n- `imprint update` — queries the npm registry for the latest\n  imprint-mcp version and runs `bun install -g im\n[…]\ntypecheck\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): add `imprint update` command and doctor version check (#93)",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-18T21:37:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "da3084a532231b21a64e54a70fd4094d510e404a",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): v0.4.1",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-18T20:57:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bc7334ad1c60cce1cf111289bea437a701e5134f",
          "body": "CDP command promises can remain pending when Chrome or the target page stops answering, which left MCP tool calls stuck before cleanup ran. Add per-command deadlines, close failed sessions, apply workflow defaults before browser bootstrap substitution, and cover the stuck-CDP and Southwest default-param regressions.",
          "is_bot": false,
          "headline": "fix(cdp): bound browser-backed replay commands (#92)",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-18T20:55:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1e95f2287ee1186c4c5f6b3a0b44b827f6050f3c",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): v0.4.0",
          "author_name": "Ashay Changwani",
          "author_login": null,
          "committed_at": "2026-06-17T07:17:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "87446929ea6625785dd3c0242301ff1c52d7b904",
          "body": "…e MCP sharing (#91)\n\n* feat(cli): add `imprint export` and `imprint import` for cross-machine MCP sharing\n\nBefore this change, sharing generated MCP tools across machines required\nmanually copying ~/.imprint/<site>/ directories and separately running\n`imprint credential export` per site. There was \n[…]\ng import.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): add `imprint export` and `imprint import` for cross-machin…",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-17T07:16:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8bd23e241afd16aac970c2963d3707a622758a94",
          "body": "…from issues (#90)\n\n* fix(mcp): prune sessionless _pending at status time, drop incomplete from issues\n\nThe _pending prune fix (dd820d7) only ran inside teach(), so stale entries\npersisted in `imprint mcp` status output until the user re-taught each site.\nAdditionally, the prune logic required stem-\n[…]\none line.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(mcp): prune sessionless _pending at status time, drop incomplete …",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-17T05:42:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "dd820d71b97e74ffdc5c334dd7ddbb6f2b4fe738",
          "body": null,
          "is_bot": false,
          "headline": "fix(teach): prune stale pending resume state (#88)",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-08T09:09:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4a1c5832ea19d0daadc682ef960145920d251fe1",
          "body": null,
          "is_bot": false,
          "headline": "fix(teach): persist triaged session paths (#89)",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-08T08:51:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a50575729b61159aeb5b0eec6596bdba3ad3a140",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): v0.3.1",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-07T23:34:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "349b49e7c1ee833d600d975ad7ce36f08bfe8b29",
          "body": null,
          "is_bot": false,
          "headline": "chore(agents): document npm release publishing",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-07T23:33:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3b490443973a82137e2ebac87e203df54bb50611",
          "body": "* fix(examples): make checked-in MCPs self-contained\n\n* fix(compile): typecheck artifacts from real tmp paths\n\n* chore(agents): add project workflow skills\n\n* fix(install): make browser-backed MCPs self-bootstrapping",
          "is_bot": false,
          "headline": "fix: make browser-backed MCP installs self-bootstrapping (#87)",
          "author_name": "Ashay Changwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-07T23:29:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c703a6ad4353c9c7b6414b313052b89657c2af76",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): v0.3.0",
          "author_name": "Ashay Changwani",
          "author_login": null,
          "committed_at": "2026-06-06T21:41:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "32a3f290f5ec6122dab3b555df0b4ba24920dfcf",
          "body": "…es, docs & demo (#84)\n\n* fix(compile): contain + amortize the compile CDP pool, prefer cdp-replay\n\n`runWorkflowWithLadder` (the compile/test path) created its CDP pool fresh per\ncall and never closed it. A winning cdp-replay therefore left a real Chrome open\nafter the function returned: `bun test` \n[…]\nild pass.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(teach): reliable compile/ladder/audit pipeline + refreshed exampl…",
          "author_name": "ashaychangwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-06T21:37:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b36253c6aa2514b6cf2e59866540af587c3ed82a",
          "body": "…y at exit (#86)\n\nPreviously, all three compile backends (in-process agent loop, claude-cli,\ncodex-cli) accumulated the conversation log in memory and wrote it to disk\nin a single writeFileSync at the very end. This meant that during a 10-20\nminute teach run, the log file either didn't exist or was \n[…]\ns the path computation that was previously split\n  between init and teardown.\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(compile): flush .compile-log.json after every turn instead of onl…",
          "author_name": "ashaychangwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-06T01:32:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6c60e0a9947241097ccb3e8ccd3d152ab48121e3",
          "body": "Consolidated all the scattered debugging env vars, CLI flags, log file\npaths, and diagnostic commands for `imprint teach` into two places:\n\n1. A new CLAUDE.md section (\"Debugging teach runs\") with quick-reference\n   tables for env vars (IMPRINT_DEBUG, IMPRINT_REPLAY_DEBUG,\n   IMPRINT_TRACE, IMPRINT_\n[…]\ndit) in CLAUDE.md's skill index so all three are\ndiscoverable from one place.\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add teach debugging guide and /debug-teach skill (#85)",
          "author_name": "ashaychangwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-05T22:56:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ca6bb890f84e4be420e063751e02ccc8fdb5a9b2",
          "body": "The multi-progress renderer uses CSI CPL (\\x1b[nF) to move the cursor\nback up N lines before redrawing. It tracked N as the number of logical\nentries (map size), but when a line exceeded the terminal width it\nwrapped to 2+ physical lines, making the CPL count too small — the\ncursor didn't go back fa\n[…]\nape-sequence modes (CPL, CPL-raw, DECSC, CR)\nfor cross-terminal verification.\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(tui): truncate progress lines to prevent wrap-induced pile-up (#83)",
          "author_name": "ashaychangwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-05T20:25:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "44f59198cc2db941c250ffc56909249a0d2b3806",
          "body": "* docs: overhaul README for professional open source look\n\n* docs: refine README with nav links, HTML table diagram, collapsible install\n\n* docs: add GitHub alert callout for security tip\n\n* docs: add tracing guide, param grounding, CDP pool, and cost rollup docs\n\nAdd standalone tracing.md deep-dive\n[…]\nmanifest.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: overhaul README and add deep-dive documentation (#82)",
          "author_name": "ashaychangwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-05T19:19:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "df525aa0e8ab176e210353f932123bb22e23fa3c",
          "body": "* feat(compile): parallel probe, CDP pool, pickBaseUrl fix, date injection\n\nGeneral compile-time and runtime improvements for anti-bot sites:\n\n1. Parallel probe: race fetch/cdp-replay/stealth-fetch on the first\n   compile-time call (45s deadline). The fastest success wins and gets\n   memoized — a ta\n[…]\ngnostics.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(compile): parallel probe, CDP pool, ladder fallback fixes (#81)",
          "author_name": "ashaychangwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-05T11:34:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b05e9879f9765024230d8c8639896503f03846b3",
          "body": "…down (#80)\n\nPhoenix shows $0 on cli.teach / cli.audit root spans because cost\nattributes were only emitted on leaf LLM spans. Root spans had no\naggregate cost, so the trace-level view was blind to total spend.\n\nAdd `tracedWithCostRollup` — wraps `traced` with an AsyncLocalStorage\naccumulator that e\n[…]\n rolled-up cost and\nskip root spans in sumCostTotal to avoid double-counting.\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(tracing): roll up LLM costs to root spans with cache-aware break…",
          "author_name": "ashaychangwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-05T05:32:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a8b981f65ef706e007a42df38e7801bba67f33a0",
          "body": "…and candidate-segmentation fix (#76)\n\n* feat(compile): differential param grounding + input-value provenance hints\n\nTwo grounding signals surfaced to the compile agent via read_session_summary, so\nit wires parameters from evidence in the recording instead of eyeballing one\nrequest and guessing.\n\n1.\n[…]\nnsistent.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(compile): differential param grounding, input-value provenance, …",
          "author_name": "ashaychangwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-05T00:35:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "40da218b6cc673f86ed87dce1c7381b9da78ecc3",
          "body": "Two local dev-workflow skills used while iterating on teach/audit runs:\n- imprint-teach-deepdive: structured deep-dive into a teach run's artifacts\n  (detect-candidates, build-plan, compile logs) for debugging compile output.\n- imprint-reteach-audit: re-teach a site from scratch and audit it end-to-\n[…]\nted tool artifacts and any recorded sessions\nare deliberately left untracked.\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: add imprint reteach-audit + teach-deepdive dev skills (#79)",
          "author_name": "ashaychangwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-05T00:34:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c422e2f319b491eb6d5dda7c180686ffc52c3205",
          "body": "… the tool (#78)\n\n* feat(audit): differentially test every advertised parameter, not just the tool\n\nThe audit was too shallow: it ran \"one realistic call + 1-2 edge cases per\ntool\" and scored purely on per-invocation verdicts. A parameter that is\ntemplated and reaches the API but has NO observable e\n[…]\nvel line.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(audit): differentially test every advertised parameter, not just…",
          "author_name": "ashaychangwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-04T10:51:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "deb7aec971bc03b206ff554c73a5b7b400e0e610",
          "body": "* fix(teach): route build-plan progress through TUI spinner\n\nThe planning subtree (build-plan, teach-plan, prereq-builder) was writing\nprogress and failure messages directly to stderr via the module logger,\nwhich collided with the TUI spinner and produced garbled output during\n`imprint teach`.\n\nAdd \n[…]\n-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(teach): route build-plan progress through TUI spinner (#74)",
          "author_name": "ashaychangwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-04T07:25:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e011c08405692abfd04f0be677a935435aa4d1a7",
          "body": "…tch-bootstrap (#71)\n\nLands the full Akamai-surviving API-replay effort on main: fetch-bootstrap + cdp-replay rungs, NETWORK escalation across rungs, stealth Playwright/UA, compile-time capture cross-checks + bounded live .act volume, audit live-invocation gate, and the prereq-builder stale-import fix (valid shared signers no longer wrongly pruned). Squash of the fix-bot-defense-escape-hatch stack (incl. #72).",
          "is_bot": false,
          "headline": "fix(ladder): escalate NETWORK across rungs; stealth Playwright for fe…",
          "author_name": "ashaychangwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-03T20:35:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6b164593eb2b18961a8be693b9980550eead3073",
          "body": "The `llm.analyze` cost path was cache-blind. Verified against live Phoenix\ntraces: every recent LLM span was `llm.analyze` (playbook compilation, triage,\nprereq planning, tool-candidate/plan), 0/50 carried any cache-token data, and\nmany fell back to a chars/4 token estimate. Providers report `usage.\n[…]\nict (exit 3) with cost\nand turn counts recorded. 884 tests pass.\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(tracing): make LLM analyze + audit cost cache-aware in traces (#73)",
          "author_name": "ashaychangwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-01T23:14:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6b91e1eb5072aebcf24fc0b6029e38635834e45b",
          "body": "`imprint mcp` audited untracked session recordings as a fixable\n\"orphan-session\" issue: it listed each one, counted them per site, exposed\nthem in --json, and its interactive \"Fix an issue\" flow deleted them behind a\nsingle confirm. That contradicts Imprint's core principle — the recording IS\nthe ir\n[…]\ntay on disk, and updates the maintenance + troubleshooting docs.\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(mcp): never report or delete orphan recordings (#70)",
          "author_name": "ashaychangwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-01T02:01:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "54d1e8ba75c43eff5a2344385063eb4f278b4d8b",
          "body": "… gate (#69)\n\n* feat(teach): plan-driven multi-tool compile and headless-claude audit gate\n\nRaise MCP-tool execution accuracy by making the multi-tool teach pipeline\nplan-first and observable, and prove it with an automated acceptance gate.\n\nThe branch had grown two competing strategies for accuracy\n[…]\n-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(teach): plan-driven multi-tool compile and headless-claude audit…",
          "author_name": "ashaychangwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-06-01T01:09:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "206a3de985fdf8510ee37896ff75a77ed1207992",
          "body": "…(#68)\n\n* feat(teach): parallel contract test framework + playbook extract fix\n\nAdds a TDD-like contract test framework that generates and runs test specs\nin parallel with the compile agent during `imprint teach`. When the compile\nagent finishes producing workflow.json + parser.ts, pre-written contr\n[…]\n Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(teach): parallel contract test framework + playbook extract fix …",
          "author_name": "ashaychangwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-05-29T10:17:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "18cbb0494eba063817e94135d19e1271737b5c69",
          "body": "Configure the npm-publish release job to use npm's trusted publishing\nfeature, which authenticates via GitHub Actions OIDC — no NPM_TOKEN\nsecret needed. Requires Node 24 (ships npm >=11.5.1 which handles the\nOIDC token exchange internally). Provenance attestation is added\nautomatically by the truste\n[…]\nher config on npmjs.com.\n\nAlso bumps version to 0.2.1 and removes the .npmrc token template\nthat was causing local auth conflicts.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci(release): add tokenless npm trusted publishing via OIDC",
          "author_name": "Ashay Changwani",
          "author_login": null,
          "committed_at": "2026-05-27T07:47:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4c75dbcff01db1d9d7c8745b5e6f977a0f05a7c1",
          "body": "* feat(dist): publish as npm package and standalone binary\n\nImprint was only installable via git clone + bun link. This adds two\ndistribution channels so users can install without cloning:\n\n**npm** — `bun install -g imprint-mcp` or `bunx imprint-mcp`. Ships\nTypeScript source directly (Bun runs it na\n[…]\n Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dist): publish as npm package and standalone binary (#63)",
          "author_name": "ashaychangwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-05-27T06:48:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e53f6830287023bb61e16262163a6d13cc0baf74",
          "body": "The previous 10-minute default was too tight for complex tools that\ninvolve multi-request workflows. The compile agent writes the full MCP\nserver and runs thorough verification tests, so 10-15 minutes is\ntypical for non-trivial sites. Bumping to 20 minutes reduces spurious\ntimeouts without requiring\n[…]\nhat was\nalready out of date with the previous 10-minute default.\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(compile): increase default timeout to 20 minutes (#65)",
          "author_name": "ashaychangwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-05-27T00:23:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d194004dd486cddf156b5aee05d4ababf2f1e914",
          "body": "* fix(teach): make credential extraction body-shape-agnostic\n\nWhen generating MCP tools for the panw-canteen site, three tools shipped\nwith `userid`/`password` modelled as required workflow parameters\n(templated as `${param.X}` in the LOGIN body) instead of pulling from\nthe credential store via `${c\n[…]\n Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(teach): make credential extraction body-shape-agnostic (#64)",
          "author_name": "ashaychangwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-05-27T00:13:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a59551290fbfed2c5c70351d4601fecd1cb47911",
          "body": "* feat(compile): interactive timeout extension for compile agents\n\nWhen a compile agent hits the wall-clock deadline (default 10 minutes),\nthe user is now prompted \"Give it more time?\" instead of the agent being\nkilled immediately. Accepting extends the deadline by 10 more minutes\n(repeatable). Decl\n[…]\n Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(compile): interactive timeout extension for compile agents (#59)",
          "author_name": "ashaychangwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-05-26T09:26:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "54793ab398f90735d1810100d97c3ab14cdf8c0d",
          "body": "* feat(teach): offer to combine past sessions before compile\n\nAfter recording a new session, `imprint teach` now lists past recordings\nfor the same site and offers to merge them with the new one. The combined\nsession feeds into triage and candidate detection so the LLM sees all\nrequests, events, and\n[…]\n Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(teach): combine past sessions before compile (#61)",
          "author_name": "ashaychangwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-05-26T08:59:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0660fa30abbc1c8a60a353eab2f3bb78927f7a40",
          "body": "Vertex required a billing-enabled GCP project, Vertex AI API access, and\nAnthropic Claude model allow-listing — a heavy setup burden that blocked\nsolo developers and OSS contributors. Now that anthropic-api, claude-cli,\nand codex-cli cover all use cases, Vertex adds complexity without unique\nvalue.\n\n[…]\nection test, Vertex-specific detection and status tests removed.\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(llm): remove Vertex AI provider (#60)",
          "author_name": "ashaychangwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-05-25T00:03:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e6ea9fb784c4af02a99830724816333d52d391ed",
          "body": "…(#58)\n\n* perf(compile): inline data + capture hints + credential pass-through\n\nThe compile agent was timing out on simple 2-3 request tools because the\nsession summary withheld all request/response content, forcing 20-30\nserial MCP tool calls that inflated context from 20K to 130K tokens.\nPhoenix t\n[…]\n Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "perf(compile): inline data + capture hints + credential pass-through …",
          "author_name": "ashaychangwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-05-24T06:56:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1d6d4823d224d4fbc3697da0dcf407d284e3fb26",
          "body": "…line (#57)\n\n* fix(teach): preserve cross-origin API requests in tool detection pipeline\n\nWeb apps that serve their frontend and API from different registrable domains\n(e.g. zipthruordering.com frontend + mynextep.net API) had all non-auth API\nrequests silently dropped at three independent stages: i\n[…]\n Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(teach): preserve cross-origin API requests in tool detection pipe…",
          "author_name": "ashaychangwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-05-23T00:30:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a24e90abead107d1cbd2d2f0a6b9315c2dab0280",
          "body": "When --from-session was used and a .redacted.json already existed from\na previous run, the teach pipeline skipped the redact step entirely\n(startFrom = 'replay-and-diff'). This meant extractCredentials() never\nre-ran, so any improvements to credential detection (like the\nUSERNAME_KEY_RE expansion) h\n[…]\nes extraction always runs with the latest field detection logic.\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(teach): always re-run redaction for --from-session (#56)",
          "author_name": "ashaychangwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-05-22T23:20:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4ee5a9c40982eee9ca41429887f4905a6471b420",
          "body": "RPC-style APIs (e.g. panw-canteen's /foundation/api/execute) multiplex\nmany distinct operations through a single URL, distinguishing them only\nby request body content. The triage compaction grouped requests by\n[method, url, paramSignature, resourceType, status, mimeType] — no body\ninformation — so a\n[…]\nepeated requests (same URL + same\nbody) still compact correctly.\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(compile): include bodyDigest in triage grouping key (#55)",
          "author_name": "ashaychangwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-05-22T22:54:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "174429351efabe2768bd0492375ff610996d93db",
          "body": "* fix(teach): auto-save credentials for userid/loginid login forms\n\nThe credential extractor (extractCredentials) missed login forms using\nfield names like `userid` or `loginid` because USERNAME_KEY_RE only\nmatched `user`, `username`, `email`, `login`, `account`, and patron\nvariants. Meanwhile `user\n[…]\n Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(teach): auto-save credentials for userid/loginid login forms (#54)",
          "author_name": "ashaychangwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-05-22T21:55:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c8b3ba393ec3e0b25f95d7b6f66e76b137ee95bc",
          "body": "…C/DECRC (#53)\n\nThe multi-line compile progress display used DECSC/DECRC (\\x1b7/\\x1b8) for\ncursor save/restore. These are DEC private escape sequences that not all\nterminals implement — Warp being the notable one. When silently ignored,\nevery redraw appended all status lines instead of overwriting i\n[…]\nne. Also removes the now-unnecessary cursorSaved\nstate variable.\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(compile): use standard CSI CPL for multi-progress instead of DECS…",
          "author_name": "ashaychangwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-05-22T21:25:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "69f213f4d45dd66c689dd9e508a58bbb618fc1fc",
          "body": "The replay-and-diff stage replays the entire recorded flow in a fresh\nbrowser session to classify request values as constant vs browser-minted\n(timestamps, CSRF tokens, etc.). This takes ~2 minutes and was previously\nalways-on unless --skip-replay was passed.\n\nNow, in interactive mode, the user is a\n[…]\nn-interactive mode and --skip-replay continue\nto work as before.\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(teach): prompt user before replay stage (#52)",
          "author_name": "ashaychangwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-05-22T21:03:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "11b1908272d19c9cf08f0c35d62e0405ffa1147a",
          "body": "* feat: install emitted MCP servers\n\n* fix(install): address review findings from PR #49\n\nDeduplicate shellQuote and PLATFORMS — both were defined identically in\nintegrations.ts and install.ts. Now exported once from integrations.ts\nand imported everywhere (cli.ts, install.ts).\n\nAdd error handling f\n[…]\n Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: install emitted MCP servers (#49)",
          "author_name": "ashaychangwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-05-22T20:19:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7977092f011b9661ae43f978782f08c8f4cc7551",
          "body": "`imprint mcp` interactive flow previously presented \"Fix an issue\" as a\nsingle-select, so when the status scan turned up a long list of\nincomplete workflows, missing-session pointers, and orphan recordings,\nyou had to re-enter the menu once per issue. With long lists from a\nreal working directory (~\n[…]\nthe existing single-issue fix paths via a new `fixIssue` helper.\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(mcp): bulk-fix issues via multi-select with select all/none (#51)",
          "author_name": "ashaychangwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-05-22T20:12:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ee1b84c95db5a0efa4da8e07162131b819a2cb50",
          "body": "* feat(mcp): add maintenance utility\n\n* fix(mcp): clean up help text, unused params, and add interactive delete confirmation\n\nThree minor review fixes for the mcp maintenance commands:\n\n1. The --client flag description now mentions \"all\" as a valid value,\n   matching the usage line that already show\n[…]\n Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(mcp): add maintenance commands (#50)",
          "author_name": "ashaychangwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-05-22T19:57:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a1ecb4ebfb38abdcfa128a4a430a577b100ce423",
          "body": "* fix(compile): eliminate agent spinning and reduce compile time 5x\n\nTraced a 16-minute compile run via Phoenix and found five root causes for\nwasted turns:\n\n1. The system prompt referenced `src/imprint/types.ts` and told the agent\n   to read WorkflowSchema from it. The agent used `run_bash` with `s\n[…]\n Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(compile): eliminate agent spinning and reduce compile time 5x (#48)",
          "author_name": "ashaychangwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-05-21T05:10:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ebf4ff6a918e32220291438478f30d54052c15d0",
          "body": "…and session discovery (#47)\n\n* fix(compile): increase default timeout to 10m, fix triage compaction and session discovery\n\nThe compile agent was timing out on complex sites (e.g., 84KB responses\nrequiring 15+ turns of exploration and debugging). The 5-minute default\nwas too tight for Opus on Vertex\n[…]\n Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(compile): increase default timeout to 10m, fix triage compaction …",
          "author_name": "ashaychangwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-05-16T07:10:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ab3898efd7f0bf039b14e34eb13c5e5546a24d62",
          "body": "…s (#45)\n\n* fix(compile): retry integration test 3x before failing verification\n\nLive API endpoints can return transient empty responses — the Avis mrbb\nendpoint intermittently returns 0 vehicles between calls even with identical\nparameters. A single flaky response was triggering a full verification\n[…]\n Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(tracing): parent agent.turn spans under compile agent in CLI path…",
          "author_name": "ashaychangwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-05-15T11:43:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5c1d721cdb98cebdf63e5fd33300b93e527ccfe1",
          "body": "…#46)\n\nLive API endpoints can return transient empty responses — the Avis mrbb\nendpoint intermittently returns 0 vehicles between calls even with identical\nparameters. A single flaky response was triggering a full verification cycle\nretry (30-100s and thousands of tokens wasted).\n\nNow retries the in\n[…]\nthe time, a single transient glitch shouldn't block compilation.\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(compile): retry integration test 3x before failing verification (…",
          "author_name": "ashaychangwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-05-15T11:16:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b609319ca69a6171921d27d232a54b9eb8878aa8",
          "body": "…ll (#44)\n\n* fix(compile): fix runtime JSON parsing, compile agent path discovery, and pre-install\n\nThree root causes made `imprint teach` / `imprint generate` fail or time out\non sites whose APIs return non-standard Content-Type headers (e.g. Avis returning\n`text/html` with a JSON body):\n\n1. The ru\n[…]\n Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(compile): fix runtime JSON parsing, path discovery, and pre-insta…",
          "author_name": "ashaychangwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-05-15T10:58:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "44739bc49ee2c8b89dccc8da259896fda2aa283b",
          "body": "* feat(llm): expand available model lists for all providers\n\nThe model dropdowns in `imprint teach` only offered 2 models per\nprovider, missing many current options. Updated to include:\n\n- Anthropic: added claude-haiku-4-5, claude-opus-4-6, claude-sonnet-4-5,\n  claude-opus-4-5 alongside the existing\n[…]\n Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(llm): expand available model lists for all providers (#43)",
          "author_name": "ashaychangwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-05-15T09:27:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c3ade1413b838ffdf10ae9286eb96e6fb49c7cd5",
          "body": "…rallelism (#42)\n\nMajor teach pipeline overhaul with four interrelated changes:\n\n1. Site-level dual-pass replay: replays the entire recording in a fresh\n   browser using raw DOM events (not per-tool playbooks) to classify\n   values as constant/server_derived/browser_minted. Replaces the broken\n   pe\n[…]\ndetect → select]\n→ generate → compile-playbook → emit → register\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(teach): dual-pass replay, compile timeout, model picker, deep pa…",
          "author_name": "ashaychangwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-05-15T09:18:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4686a8024ddf1f373a2ced81a751042480eabdc0",
          "body": "…g (#41)\n\n* fix(teach): use DECSC/DECRC for reliable multi-tool progress rendering\n\nThe multi-tool compile progress in `imprint teach` was printing noisy\nscrolling output instead of updating lines in-place. The root cause was\ntwofold:\n\n1. The previous implementation used CSI CUU (`\\x1b[nA`) relative\n[…]\n Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(teach): use DECSC/DECRC for reliable multi-tool progress renderin…",
          "author_name": "ashaychangwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-05-15T07:10:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0ee832cdac5fc4051492b12581cf75da4ecf960d",
          "body": "…harness (#40)\n\nThe OpenTelemetry SDK defaults to 128 attributes per span. Phoenix's\ngetLLMAttributes() flattens each input message into 2+ attributes (role,\ncontent, tool_calls…), so conversations past ~56 messages silently hit\nthe cap. When that happens, setSpanAttributes() after the LLM response\n\n[…]\n\nthat wasted ~28 turns and ~500k tokens in the Avis compilation.\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(teach): fix tracing token loss and pre-install @types in compile …",
          "author_name": "ashaychangwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-05-15T02:36:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e45f178e1e6d2a666b4c8389e9e16fe358d01df1",
          "body": "Generated tools at ~/.imprint/<site>/<tool>/index.ts import from\n'imprint/runtime', resolved through a node_modules/imprint symlink\ncreated by `imprint emit`. The symlink targets the repo path that ran\nemit. If that path moves or vanishes (Conductor workspaces, git\nworktrees, repo relocations), ever\n[…]\nloaded\nand the link now points at the running repo.\n\nDocs updated to reflect that the symlink is maintained at both emit\nand runtime.\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>",
          "is_bot": false,
          "headline": "fix(runtime): self-heal node_modules/imprint symlink at tool load (#36)",
          "author_name": "ashaychangwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-05-15T01:59:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fafc64780d425caa6f98ccbbd70f39a07925c2bd",
          "body": "…#38)\n\nThe --keep-test flag on `teach` and `generate` retains the agent-generated\nparser.test.ts and integration.test.ts after compilation. Previously it was\nonly available as a CLI flag, which meant users who always want test retention\nhad to pass it every time.\n\nNow IMPRINT_KEEP_TEST=1 works as an\n[…]\n ?raw imports from docs/, so changes flow through automatically.\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): support IMPRINT_KEEP_TEST=1 env var for --keep-test flag (…",
          "author_name": "ashaychangwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-05-15T01:58:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "413741c742347fbc4716cf76d200ff2f0a4b3339",
          "body": "* fix(teach): update multi-tool progress lines in-place instead of scrolling\n\nWhen `imprint teach` compiles multiple tools concurrently, each agent fires\n30-80+ progress events (\"thinking\" → \"running command\" → \"thinking\" → …).\nWith concurrency 3, the old code wrote every update as a new stderr line\n[…]\n Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(teach): update multi-tool progress lines in-place (#35)",
          "author_name": "ashaychangwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-05-15T01:56:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6becad0da7529cfb39b33abe3f73716c810aecb3",
          "body": "Every push and PR was triggering a Vercel preview build for the website,\nwhich is unnecessary churn — the site only needs to deploy on merges to\nmain. Added `ignoreCommand` to `web/vercel.json` that checks\n`$VERCEL_ENV`: preview builds exit 0 (skip), production builds exit 1\n(proceed). This is the o\n[…]\nly documented approach from Vercel's\nproject configuration docs.\n\nCo-authored-by: Ashay Changwani <achangwani@paloaltonetworks.com>\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci(web): disable Vercel preview deployments (#37)",
          "author_name": "ashaychangwani",
          "author_login": "ashaychangwani",
          "committed_at": "2026-05-15T01:56:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        }
      ],
      "releases_count": 25,
      "commits_last_year": 282,
      "latest_release_at": "2026-07-18T02:28:49Z",
      "latest_release_tag": "v0.6.5",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 12,
      "days_since_latest_release": 5,
      "mean_days_between_releases": 2.4
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 71,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "imprint-mcp",
          "exists": true,
          "license": "MIT",
          "keywords": [],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/imprint-mcp",
          "is_deprecated": false,
          "latest_version": "0.6.5",
          "repository_url": "https://github.com/ashaychangwani/imprint",
          "versions_count": 24,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 2525,
          "first_published_at": "2026-05-27T07:09:25.255000Z",
          "latest_published_at": "2026-07-18T02:29:05.772000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        }
      ]
    },
    "popularity": {
      "forks": 1,
      "stars": 18,
      "watchers": 0,
      "fork_history": {
        "days": [
          {
            "date": "2026-05-15",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 1,
        "total_forks": 1
      },
      "star_history": null,
      "open_issues_and_prs": 7
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": true,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 189362,
      "source_files_sampled": 249,
      "oversized_source_files": 11,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 10645
    },
    "dependencies": {
      "manifests": [
        "package.json",
        "web/package.json"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [
        {
          "name": "@anthropic-ai/sdk",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.52.0"
        },
        {
          "name": "@arizeai/phoenix-otel",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.0.2"
        },
        {
          "name": "@clack/prompts",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.3.0"
        },
        {
          "name": "@modelcontextprotocol/sdk",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.0.0"
        },
        {
          "name": "@napi-rs/keyring",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.3.0"
        },
        {
          "name": "@noble/hashes",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.2.0"
        },
        {
          "name": "@opentelemetry/api",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.9.1"
        },
        {
          "name": "chrome-remote-interface",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.33.0"
        },
        {
          "name": "env-paths",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.0.0"
        },
        {
          "name": "libsodium-wrappers",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.8.4"
        },
        {
          "name": "node-cron",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.0.3"
        },
        {
          "name": "playwright",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.49.0"
        },
        {
          "name": "playwright-extra",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.3.6"
        },
        {
          "name": "puppeteer-extra-plugin-stealth",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.11.2"
        },
        {
          "name": "redactum",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.1.0"
        },
        {
          "name": "semver",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.8.4"
        },
        {
          "name": "tldts",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.4.8"
        },
        {
          "name": "yaml",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.8.4"
        },
        {
          "name": "zod",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.24.0"
        },
        {
          "name": "@vitejs/plugin-react",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "6.0.1"
        },
        {
          "name": "highlight.js",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^11.11.1"
        },
        {
          "name": "react",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "19.2.6"
        },
        {
          "name": "react-dom",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "19.2.6"
        },
        {
          "name": "react-markdown",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^10.1.0"
        },
        {
          "name": "react-router-dom",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.15.0"
        },
        {
          "name": "rehype-highlight",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.0.2"
        },
        {
          "name": "rehype-slug",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.0.0"
        },
        {
          "name": "remark-gfm",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.0.1"
        },
        {
          "name": "vite",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "8.0.12"
        }
      ],
      "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": 3,
        "merged_prs": 108,
        "open_issues": 4,
        "closed_ratio": 0.2,
        "closed_issues": 1,
        "closed_unmerged_prs": 8
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "ashaychangwani",
          "commits": 128,
          "avatar_url": "https://avatars.githubusercontent.com/u/29693329?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "commitlint.yml",
        "release.yml",
        "test.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [],
      "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": 10,
            "reason": "17 out of 17 merged PRs checked by a CI test -- score normalized to 10",
            "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": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 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": 10,
            "reason": "packaging workflow 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": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 10,
            "reason": "security policy file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "35 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "a16fdfc4a50a049a52b6adffbaea588c21d2c384",
        "ran_at": "2026-07-23T11:36:13Z",
        "aggregate_score": 3.1,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": true,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-18T02:29:12Z",
      "oldest_open_prs": [
        {
          "number": 12,
          "created_at": "2026-05-06T20:03:37Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 77,
          "created_at": "2026-06-04T10:39:55Z",
          "last_comment_at": "2026-06-04T10:40:02Z",
          "last_comment_author": "vercel"
        },
        {
          "number": 124,
          "created_at": "2026-07-21T05:02:23Z",
          "last_comment_at": "2026-07-21T05:02:29Z",
          "last_comment_author": "vercel"
        }
      ],
      "last_merged_pr_at": "2026-07-18T02:05:35Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 101,
          "created_at": "2026-06-24T18:16:35Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 104,
          "created_at": "2026-06-25T01:19:40Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 107,
          "created_at": "2026-06-26T08:13:27Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 117,
          "created_at": "2026-07-09T09:20:19Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/ashaychangwani/imprint",
    "host": "github.com",
    "name": "imprint",
    "owner": "ashaychangwani"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 57,
      "inputs": {
        "security": 31,
        "vitality": 73,
        "community": 47,
        "governance": 48,
        "engineering": 81
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 73,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 62,
            "inputs": {
              "commits_last_year": 282,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 12
            },
            "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": "12/52 weeks with commits",
                "points": 8.3,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 12
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "282 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 282
                    }
                  }
                ],
                "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": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 25,
              "latest_release_tag": "v0.6.5",
              "releases_from_tags": false,
              "days_since_latest_release": 5,
              "mean_days_between_releases": 2.4
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "25 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 25
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 5 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~2.4 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 2.4
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 47,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 20,
            "inputs": {
              "forks": 1,
              "stars": 18,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "18 stars",
                "points": 20,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 18
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "1 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "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": "good",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 70,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "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": 57,
            "inputs": {
              "packages": [
                "imprint-mcp"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 2525
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "2,525 downloads/month across npm",
                "points": 45.4,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 2525,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "at_risk",
        "name": "Sustainability & Governance",
        "value": 48,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 10,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "at_risk",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 45,
            "inputs": {
              "merged_prs": 108,
              "open_issues": 4,
              "closed_issues": 1,
              "issue_closed_ratio": 0.2,
              "closed_unmerged_prs": 8
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "20% of issues closed",
                "points": 9.3,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 20
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "108/116 decided PRs merged",
                "points": 35.6,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 108,
                      "decided": 116
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "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": 55,
            "inputs": {
              "followers": 15,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "ashaychangwani",
              "public_repos": 113,
              "account_age_days": 3314
            },
            "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": "15 followers of ashaychangwani",
                "points": 8.7,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 15,
                      "login": "ashaychangwani"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "113 public repos, account ~9 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 113
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 9
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "imprint-mcp"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 5
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 5 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "24 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 24
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 81,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "3 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": 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": "17 out of 17 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "topics": [
                "ai-agents",
                "browser-automation",
                "bun",
                "claude",
                "llm",
                "mcp",
                "mcp-server",
                "typescript",
                "web-scraping"
              ],
              "has_wiki": true,
              "homepage": "https://github.com/ashaychangwani/imprint",
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://github.com/ashaychangwani/imprint",
                "points": 15,
                "status": "met",
                "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": "9 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 9
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 31,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": null,
            "notes": [],
            "value": 31,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 18,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 0,
              "scorecard_aggregate": 3.1
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "17 out of 17 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "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 dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "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 detected",
                "points": 5,
                "status": "met",
                "details": [],
                "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": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "35 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": 66,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.99,
              "agent_instruction_files": [
                "AGENTS.md",
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 10645
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md, CLAUDE.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "99 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 99,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "at_risk",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 43,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [
                "tsconfig.json"
              ],
              "agent_commit_share": 0.54,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "54 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 54,
                      "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": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 98,
            "inputs": {
              "primary_language": "TypeScript",
              "largest_source_bytes": 189362,
              "source_files_sampled": 249,
              "oversized_source_files": 11
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "TypeScript (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "TypeScript"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "11/249 source files over 60KB",
                "points": 52.6,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 249,
                      "oversized": 11
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "moderate",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 60,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": true,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
    "deps.dev does not index npm:imprint-mcp@0.6.5; advisories assessed against the repository dependency graph instead"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-23T11:36:28.474668Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/a/ashaychangwani/imprint.svg",
  "full_name": "ashaychangwani/imprint",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

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