Публічний реєстр
Звіт про здоров'я програмного забезпеченнясхема 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 р.Переглянути на GitHub ↗

ashaychangwani/imprint має індекс здоров’я 57 зі 100, що відповідає смузі «Помірний». Найвищий показник — Engineering Quality (81/100), найнижчий — Security (31/100). Останнє оновлення — сьогодні. Більшість нещодавньої роботи виконує один учасник.

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

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

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

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

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

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

Власність

Ashay ChangwaniОсобистий обліковий запис
15 підписників113 публічних репозиторіївз черв. 2017 р.

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

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

РеєстрПакетВерсіяЗавантажень / місВерсіїОстання публікація
npmimprint-mcp0.6.52 525245 днів тому

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

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

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

73Добрий · 22% загального індексу
Як обчислюється оцінка
36/36Свіжість push — останній push 0 дн. тому
8.3/36Ритм комітів — 12/52 тижнів із комітами
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
Як обчислюється оцінка
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
Як обчислюється оцінка
22.5/22.5README
22.5/22.5Ліцензія — визнана ліцензія (MIT)
18/18Настанови CONTRIBUTING
0/13.5Кодекс поведінки
0/7.2Шаблон issue
0/6.3Шаблон PR
Використані вхідні дані
has_readmeтак
has_licenseтак
has_contributingтак
has_issue_templateні
has_code_of_conductні
has_pull_request_templateні
Як обчислюється оцінка
45.4/80Щомісячні завантаження — 2 525 завантажень/місяць у npm
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Вирішення issue — закрито 20% issue
35.6/38.3Прийняття PR — злито 108/116 вирішених PR
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Охоплення власника — 15 підписників у ashaychangwani
25/25Послужний список — 113 публічних репозиторіїв, вік облікового запису ~9 р.
Використані вхідні дані
followers15
owner_typeUser
is_verified
owner_loginashaychangwani
public_repos113
account_age_days3 314
Виключено з оцінювання (немає даних або не застосовно): Верифікований домен. Залишкові ваги перенормовано.

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

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

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

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

81Добрий · 20% загального індексу
Як обчислюється оцінка
24/24Процеси CI — 3 процес(ів) CI
24/24Наявні тести
0/16Конфігурація лінтера
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

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

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

66Помірний · 0% загального індексу
Як обчислюється оцінка
45/45Інструкції для агентів — AGENTS.md, CLAUDE.md
0/15Машиночитана документація (llms.txt)
40/40Читабельна історія комітів — намір зазначено у 99 з 100 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
has_llms_txtні
legible_history_share0,99
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes10 645
Як обчислюється оцінка
0/18Розгортання однією командою
22/22Автоматизовані тести
0/11Конфігурація лінтера / форматера
11/11Статична перевірка типів — tsconfig.json
0/10Відтворюване середовище
10/10Підтверджена практика роботи з агентами — 54 з останніх 100 комітів створено агентом або з його зазначенням
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Керовані розміри файлів — 11/249 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languageTypeScript
largest_source_bytes189 362
source_files_sampled249
oversized_source_files11
Як обчислюється оцінка
0/40Схема API (OpenAPI/GraphQL/proto)
20/20Сервер MCP
40/40Придатні до запуску приклади — examples
Використані вхідні дані
example_dirsexamples
has_mcp_signalтак
api_schema_files

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

18зірок GitHub
1контриб'юторів
282комітів за останні 12 місяців
0днів від останнього пушу
25релізів
1бас-фактор
4відкритих issue
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.