Public record
Software health reportschema 0.25.0 · metrics 1.13.0 · 2026-07-21 22:48 UTC

milky-way-66 / ai-spector

TypeScript · HTMLMIT★ 1 star⑂ 0 forkssince May 2026View on GitHub ↗

milky-way-66/ai-spector holds a health index of 34 out of 100, placing it in the At risk band. It scores highest on AI Readiness (69/100) and lowest on Security (15/100). It was last updated 13 days ago.

34
overall / 100
At risk

Software health index

Metrics are grouped into weighted categories on one standardized 1–100 scale. Overall starts as their weighted mean; when public evidence triggers the High-Risk Jurisdiction Policy, the rating is adjusted and receives an At risk ceiling of 49. AI Readiness sits outside the overall score.

34
Excellent85-100Exemplary; meets essentially all checked criteria
Good70-84Healthy; minor gaps
Moderate50-69Acceptable with notable gaps; review recommended
At risk30-49Significant weaknesses; adoption warrants caution
Critical1-29Severe problems (abandoned, single-maintainer, no hygiene)
VitalityCommunity &AdoptionSustainability &GovernanceEngineeringQualitySecurityAI Readiness

Score profile

Each axis is a category. The shape matters more than the average — a healthy subject fills the whole shape, while a spike-and-crater profile means strength in one dimension is masking risk in another.

Ownership

Milky WayPersonal account
1 follower9 public repossince Oct 2018ThangLong

This repository is owned by a personal account. A single-owner project carries more continuity risk than an organization-backed one.

Package ecosystems

RegistryPackageVersionDownloads / moVersionsLast publishTags
npmai-spector0.9.245,3301514 days agoai-spectorcursordocumentationsrstraceabilityrequirementssoftware-designgraph

Metrics by category

Vitality

Is the project alive — is code being written and are releases shipping?

32At risk · 22% of overall
How it's scored
28.8/36Push recency — last push 13 days ago
5.5/36Commit cadence — 8/52 weeks with commits
18/18Commit volume — 292 commits in the last year
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Inputs used
commits_last_year292
human_commit_share1
days_since_last_push13
active_weeks_last_year8
How it's scored
0/27Ships releases — no releases published
0/36Release recency — no releases
0/27Release cadence — no releases
0/10OpenSSF Scorecard: Signed-Releases — no data
Inputs used
releases_count0
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.

Community & Adoption

Does the project have users, downloads, attention, and a welcoming setup for contributors?

33At risk · 18% of overall
How it's scored
0/60Stars — 1 stars
0/25Forks — 0 forks
0/15Watchers — 0 watchers
Inputs used
forks0
stars1
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonbelow_threshold
How it's scored
22.5/22.5README
22.5/22.5License — recognized license (MIT)
0/18CONTRIBUTING guide
0/13.5Code of conduct
0/7.2Issue template
0/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
How it's scored
49.7/80Monthly downloads — 5,330 downloads/month across npm
0/20Registry dependents — not reported by this ecosystem
Inputs used
packagesai-spector
dependents
ecosystemsnpm
total_downloads
monthly_downloads5,330
Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.

Sustainability & Governance

Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?

43At risk · 24% of overall
How it's scored
0/46.8Issue resolution — no issues or no data
0/38.3PR acceptance — no decided pull requests or no data
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Inputs used
merged_prs0
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Excluded from scoring (no data or not applicable): Issue resolution, PR acceptance. Remaining weights renormalized.
How it's scored
10/30Ownership backing — personal (user) account
0/20Verified domain — not applicable to user accounts
2.2/25Owner reach — 1 followers of milky-way-66
19.3/25Track record — 9 public repos, account ~7 yr old
Inputs used
followers1
owner_typeUser
is_verified
owner_loginmilky-way-66
public_repos9
account_age_days2,844
Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.
How it's scored
25/25Published & resolvable — 1 package(s) on npm
35/35Publish recency — latest publish 4 days ago
20/20Version history — 151 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packagesai-spector
ecosystemsnpm
any_deprecatedno
min_days_since_publish4

Engineering Quality

Are baseline engineering and documentation practices in place?

44At risk · 20% of overall
How it's scored
0/24CI workflows
24/24Tests present
0/16Linter config
0/9.6Pre-commit hooks
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — no data
Inputs used
has_cino
has_testsyes
has_editorconfigno
has_linter_configno
has_precommit_configno
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.

Documentation

65Moderate
How it's scored
30/30README
25/25Documentation directory
0/15Documentation / homepage site
0/10Repository description
0/10Topics
10/10Wiki
Inputs used
topics
has_wikiyes
homepage
has_readmeyes
has_docs_diryes
has_descriptionno

Security

Are visible security and supply-chain practices strong, without unresolved high-risk jurisdiction exposure?

15Critical · 16% of overall
How it's scored
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — no data
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
0/10Dangerous-Workflow — no data
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5License — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
0/5Packaging — no data
0/5Pinned-Dependencies — no data
0/5SAST — no SAST tool detected
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — no data
0/7.5Token-Permissions — no data
0/7.5Vulnerabilities — 27 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated12
scorecard_versionv5.5.0
checks_inconclusive6
scorecard_aggregate1.5
Excluded from scoring (no data or not applicable): ci_tests, dangerous_workflow, packaging, pinned_dependencies, signed_releases, token_permissions. Remaining weights renormalized.

AI Readiness

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.

69Moderate · 0% of overall
How it's scored
45/45Agent instructions — AGENTS.md, CLAUDE.md, scaffold/claude/CLAUDE.md, scaffold/prototype/CLAUDE.md
0/15Machine-readable docs (llms.txt)
40/40Legible commit history — 87 of 100 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share0.87
agent_instruction_filesAGENTS.md, CLAUDE.md, scaffold/claude/CLAUDE.md, scaffold/prototype/CLAUDE.md
agent_instruction_max_bytes19,319
How it's scored
0/18One-command bootstrap
22/22Automated tests
0/11Lint / format config
11/11Static type checking — tsconfig.json, website/tsconfig.json
10/10Reproducible environment — lockfile
0/10Demonstrated agent practice — no agent-authored commits among the last 100
0/8Automated maintenance — no automated dependency updates observed
0/10OpenSSF Scorecard: Pinned-Dependencies — no data
Inputs used
has_nixno
has_testsyes
lockfilespackage-lock.json
has_dockerfileno
typed_languageyes
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configstsconfig.json, website/tsconfig.json
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Pinned-Dependencies. Remaining weights renormalized.
How it's scored
45/45Type-checkable code — TypeScript (statically typed)
54.8/55Manageable file sizes — 2/477 source files over 60KB
Inputs used
primary_languageTypeScript
largest_source_bytes83,366
source_files_sampled477
oversized_source_files2
How it's scored
0/40API schema (OpenAPI/GraphQL/proto)
20/20MCP server
40/40Runnable examples — examples
Inputs used
example_dirsexamples
has_mcp_signalyes
api_schema_files

Key facts

1GitHub stars
-contributors
292commits, last 12 months
13days since last push
0releases
-bus factor
0open issues
npmpackage ecosystems

Data collection warnings

  • Contributor list unavailable
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository
  • deps.dev does not index npm:ai-spector@0.9.24; advisories assessed against the repository dependency graph instead

More detail

OpenSSF Scorecard 1.5 / 10
1.5aggregate

Independent, tool-agnostic security assessment from the open-source OpenSSF Scorecard. Each check rewards a security practice, not a specific vendor's tool. Checks Scorecard could not determine are marked n/a and excluded from the security score (never counted as zero).Scorecard v5.5.0 · 2026-07-21 22:48 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
n/aCI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
n/aDangerous-Workflowno workflows found
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
n/aPackagingpackaging workflow not detected
n/aPinned-Dependenciesno dependencies found
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
n/aSigned-Releasesno releases found
n/aToken-PermissionsNo tokens found
0Vulnerabilities27 existing vulnerabilities detected
Direct dependencies 23
RegistryPackageVersion constraintManifest
npm@modelcontextprotocol/sdk^1.29.0package.json
npm@types/mdast^4.0.4package.json
npmajv^8.17.1package.json
npmajv-formats^3.0.1package.json
npmcommander^12.1.0package.json
npmrehype-stringify^10.0.1package.json
npmremark-gfm^4.0.1package.json
npmremark-parse^11.0.0package.json
npmremark-rehype^11.1.2package.json
npmsemver^7.8.4package.json
npmunified^11.0.5package.json
npmunist-util-visit^5.1.0package.json
npmzod^4.4.3package.json
npm@docusaurus/core3.10.1website/package.json
npm@docusaurus/faster3.10.1website/package.json
npm@docusaurus/preset-classic3.10.1website/package.json
npm@docusaurus/theme-mermaid^3.10.1website/package.json
npm@mdx-js/react^3.0.0website/package.json
npmclsx^2.0.0website/package.json
npmprism-react-renderer^2.3.0website/package.json
npmreact^19.0.0website/package.json
npmreact-dom^19.0.0website/package.json
npmunist-util-visit^5.1.0website/package.json
All dependencies not collected

The resolved dependency set could not be collected for this report: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Raw JSON report machine-readable
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 5390,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "CSS": 1913,
        "HTML": 1902518,
        "Shell": 6499,
        "Python": 14988,
        "JavaScript": 136508,
        "TypeScript": 2402829
      },
      "pushed_at": "2026-07-08T05:25:27Z",
      "created_at": "2026-05-21T06:54:15Z",
      "owner_type": "User",
      "updated_at": "2026-07-08T05:25:31Z",
      "description": null,
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript",
        "HTML"
      ]
    },
    "owner": {
      "blog": null,
      "name": "Milky Way",
      "type": "User",
      "login": "milky-way-66",
      "company": "ThangLong",
      "location": null,
      "followers": 1,
      "avatar_url": "https://avatars.githubusercontent.com/u/43933886?v=4",
      "created_at": "2018-10-07T16:12:47Z",
      "is_verified": null,
      "public_repos": 9,
      "account_age_days": 2844
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [],
      "recent_commits": [
        {
          "oid": "db5a0362fd4eaf511ba450e7d97c1ce86c1a44ec",
          "body": "Include version bump and remaining scaffold/fixture updates for the docops guide migration flow.",
          "is_bot": false,
          "headline": "chore: bump 0.9.23 and sync Claude docops migrate runbook",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-07-08T04:13:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9d0196ab6328dcb5a7457e6d7c37453764f4019f",
          "body": "Introduce `docops guide` with current vs expected structure and config examples, bundle contract schemas in the npm package, and wire agent runbooks so \"migrate\" routes to a single self-service flow.",
          "is_bot": false,
          "headline": "feat: add docops guide for agent-driven legacy→Writer migration",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-07-08T04:12:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "02777c36dff2fcaa48b521bf35d9076944b1c053",
          "body": null,
          "is_bot": false,
          "headline": "add test script for get project setting",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-07-07T09:55:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0107629536bfc8d1dc4412c6f7c8108467482045",
          "body": "Drop gated adopt scan/plan/apply/bootstrap in favor of docops layout\n(read-only probe), docops check, PROJECT_LAYOUT guide, and UPG-012\ncontract repair on upgrade. Replace ADOPT-001 with DOC-LAYOUT-001.",
          "is_bot": false,
          "headline": "feat: remove adopt workflow; add self-service docops migration",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-07-07T08:28:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5ebc4513d4005bbf58474faee2f1919c6d84d480",
          "body": null,
          "is_bot": false,
          "headline": "update package",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-07-07T07:52:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "238cb73c437ec6354b401fa3e56cba56268c3707",
          "body": "Always scaffold detailDesign and otherDocument in docops.config.json\n(disabled by default), copy detail-design templates on init/repair, and\ndocument agent manual gap-fill when docops CLI commands fail.",
          "is_bot": false,
          "headline": "feat: default optional docops layers and manual migrate fallback",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-07-07T07:40:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2fe5f6072cbf8c5a1374b491310d913941480b24",
          "body": null,
          "is_bot": false,
          "headline": "update version",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-07-07T06:54:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b7e70a5fcc9418d1cd8655ce1147dbedb98e5701",
          "body": "Allow contract_comments reply without filePath when threadId resolves\nglobally, fixing the TypeScript build for MCP dispatch.",
          "is_bot": false,
          "headline": "fix(comments): make reply filePath optional in operation types",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-07-07T06:52:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b8d2adf368964575910b75548b6e3c6d9eeeb5f5",
          "body": "Auto-discover entity-layout threads when scope flags are missing or --file\npoints at a legacy path. Document MCP/CLI reply flows and align runbooks with\ncreate/reply actions.",
          "is_bot": false,
          "headline": "fix(comments): resolve reply by threadId and improve agent guidance",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-07-07T06:47:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c717e7029099a713f5804b383f49c0bdafc9a1fd",
          "body": "Enable CLI and contract_comments create/reply for git-backed threads,\nand document legacy path-keyed → entityId comment storage migration.",
          "is_bot": false,
          "headline": "feat: add local comment create/reply and entity migration guide",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-07-07T06:17:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "251158eb476eb82ec5a381fd79922da6e2d58453",
          "body": "Greenfield projects now bootstrap v4 review registry and auto-sync\n.docops/registry/ on init, migrate repair, and index. Legacy path-keyed\nlayouts are detected and warned without auto-migration. Docops status\nreports entity registry health; docs clarify registry vs graph defaults.",
          "is_bot": false,
          "headline": "feat: default entityId registry on docops init and index",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-07-03T10:58:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "22fa9a97e407eeb5e497a5df985fcfd47c03df1b",
          "body": "Rewrite READMEs to emphasize chat prompts over CLI reference, and route\nnpm install through internal Verdaccio in setup, skills, and course messages.",
          "is_bot": false,
          "headline": "docs: prompt-first README and private registry install defaults",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-07-03T10:26:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "557dafc21bb1d0ea660994e6b3fb253f13e83bc0",
          "body": "When both .docops/docops.config.json and .ai-spector/docflow.config.json\nexist, merge language fields from docops (including primaryLanguage ordering)\nso SRS generation targets the contract locale instead of stale legacy en-only\nsettings. Add CFG-002 workspace_check warning on mismatch and update generate\nskill docs to read docops first.",
          "is_bot": false,
          "headline": "fix: honor docops primaryLanguage over legacy docflow config",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-07-03T10:16:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "af80a61ac4eca1e292f80c75a933d48c8d9aafc5",
          "body": null,
          "is_bot": false,
          "headline": "update rule",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-07-03T06:50:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9c6dac4c88254975324efeafe7669121b519a25d",
          "body": null,
          "is_bot": false,
          "headline": "fix feedback",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-07-03T06:49:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "589979142edb4dbdf8c2dda92d49414226b7e725",
          "body": "Run review check on staged doc commits and expose hooks ci for pipelines.\nReconcile review-queue-synced in lifecycle sync and mark the step after\nreview check when sign-off is enabled.",
          "is_bot": false,
          "headline": "feat(review): CI hooks gate and review-queue-synced lifecycle step",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-07-01T08:42:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fb8ee9e3091104821392fbdf16b1bded970bd3c4",
          "body": "Add symptom rows for comments, review, prototype, and gated template-import\nin onboarding help references for the legacy-aligned lifecycle step.",
          "is_bot": false,
          "headline": "docs: expand legacy-aligned help for migrate scope",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-30T06:45:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "57aff25a71d631106b16b4dbcb21db9bf024e95d",
          "body": null,
          "is_bot": false,
          "headline": "fix build",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-30T06:15:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "09ad8abf9a2be0774b4a5172208e54b25ed7ee18",
          "body": "Require writerReady for docops-init lifecycle sync, detect and repair short\ndocTypes paths, probe git push for first-push-synced, and run full lifecycle\nsync after docops init instead of blindly marking steps done.",
          "is_bot": false,
          "headline": "feat: harden docops onboarding probes and canonical docTypes paths",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-30T06:13:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "99d6ebf59a41bf895847348fa4689e2b954402cd",
          "body": null,
          "is_bot": false,
          "headline": "fix test fail",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-29T09:47:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "90bc7b98f74cf10287fdcbafd0c7607380ee0e31",
          "body": "Add help runbook with lifecycle sync, workspace check, and symptom table;\nroute help/stuck/where-am-I/what's-next intents to ai-spector skill.",
          "is_bot": false,
          "headline": "feat: help skill and routing for lifecycle onboarding",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-29T09:27:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "90ab22bd6f157e9d39fbccaf58fd00d201b0e16c",
          "body": null,
          "is_bot": false,
          "headline": "feat: lifecycle hooks on setup adopt and docops init",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-29T09:25:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cc43ad3f879f159619dcd27983ee9913452a3577",
          "body": "Add filesystem probe reconciliation for .docops/lifecycle.json via CLI\nlifecycle sync and MCP lifecycle_sync so local adapter work can update\nonboarding checklist state before git push to Writer.",
          "is_bot": false,
          "headline": "feat: lifecycle sync CLI and MCP tool",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-29T09:23:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "39c739aef885ef3392439ad7c64c2f7a6367367e",
          "body": "Port Python docops_lifecycle core to TypeScript for adapter-side\nlifecycle sync: step definitions, reconcile from probes, summary,\nand read/write helpers for .docops/lifecycle.json.",
          "is_bot": false,
          "headline": "feat(docops): lifecycle.json load reconcile write",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-29T09:22:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "162b56c767d012c4c0ad9367fbf37468f19855c6",
          "body": "Align MIN_DOCOPS docTypes paths with the Writer contract so review\ntests resolve documents under docs/ instead of repo-root srs/.",
          "is_bot": false,
          "headline": "fix(tests): use docs/srs paths in docops test scaffold",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-26T10:15:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fb94f4304b926675da098baa0c2d82e8e1f8c75b",
          "body": "Add registry sync with screen-map import/removal, ID-keyed comment storage\nand filters, review registry v4, and CLI --entity/--screen-id. Ship\nENTITY_REGISTRY_MIGRATION guide and migrate script in contracts bootstrap.",
          "is_bot": false,
          "headline": "feat(docops): entity registry sync, comment/review migration, CLI IDs",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-26T10:04:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d22eda1366a493aeeebebb29a6cd8576c041ffee",
          "body": "…ents.\n\nResolve documents from literal docTypes.path values (e.g. docs/srs), stop expanding short segment names, and document storage_layout plus agent migration steps in MIGRATION.md.",
          "is_bot": false,
          "headline": "Use repo-root docTypes paths and expand docops migration guide for ag…",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-26T08:43:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "485a7b0533df2a3ba6364afb58e8eabb528452df",
          "body": "Satisfies strict TypeScript build for optional language.path on publish.",
          "is_bot": false,
          "headline": "fix(docops): use lang.code fallback when writing docs gitkeeps",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-26T07:33:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5f8a1e57457aebaad4afce31c07a5ad512bbb436",
          "body": "Migrate and repair now scaffold the same .docops/ files as init (guide, review,\nprototype, templates, gitkeeps) while preserving legacy copies. Share bootstrap\nlogic via applyDocopsBootstrap and fix monorepo bundle path resolution.",
          "is_bot": false,
          "headline": "feat(docops): bootstrap full Writer contract on migrate",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-26T07:32:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4fe5c2a98f1758652d5fb546cceaa1852fa1397c",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 0.9.1",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-26T06:53:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "27a0c8239f5217449b34e44c9c2be202a4673c61",
          "body": "Align ai-spector read/write paths with the Writer docops contract so both\ntools share .docops/prototype/config.json and screen-map.json.",
          "is_bot": false,
          "headline": "fix: use .docops/prototype/ for prototype config and screen-map",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-26T06:23:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5a281693aeb9f484156b1517d9f5b8a8ba47e2ac",
          "body": "Document 2-config model, 4-skill scaffold, work/contract CLI, and 0.9.0 breaking changes.",
          "is_bot": false,
          "headline": "docs: writer-contract redesign migration guide",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-26T04:42:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5fab374f520223d1fe7c6232edb8b4a081a768be",
          "body": "…ntract only\n\n- init.ts: scaffold engine.json via writeEngineConfig; do NOT write\n  docflow.config.json on fresh init\n- upgrade/stamp.ts: stamp scaffoldVersion in engine.json (not docflow);\n  legacy read fallback retained for existing projects\n- capabilities.ts: remove PLUGIN_CAPABILITY_MAP, resolve\n[…]\ne.ts: update init marker checks to work without docflow file\n- package.json: bump minor version to 0.9.0 (breaking change)\n- tests: update capabilities + apply tests to reflect removed plugin registry",
          "is_bot": false,
          "headline": "refactor!: remove docflow.config.json from init; capabilities from co…",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-26T04:41:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "31e6b3b3b8d8d41d0b61b8a8de39124d71dd55c8",
          "body": "Consolidate 23 ai-spector skills into 4 per design spec §5:\n- ai-spector: core (setup, upgrade, adopt, check, docops, course, work sessions)\n- ai-spector-generate: SRS, basic design, detail design, prototype, resolve-task, template-import\n- ai-spector-graph: graph ops + search + sync-audit\n- ai-spec\n[…]\nrity list.\nUpdate WORKFLOW.md and CLAUDE.md for 4-skill surface.\nUpdate claude-from-cursor.ts skill→task mapping to 4-skill model.\nAdd/update scaffold tests to assert exactly 4 ai-spector* skill dirs.",
          "is_bot": false,
          "headline": "feat(scaffold): reduce to 4 writer-contract skills",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-26T04:29:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "22c79529abbe47e3d2981bd0cbe6ee6c2c6ebb86",
          "body": null,
          "is_bot": false,
          "headline": "feat(check): docops + engine rules with capability skip",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-26T04:15:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2e86e154d08d4f4ac25e99e24f3cf6ee8b1b5961",
          "body": "Add contract review/comments/prototype/translate CLI subcommands\nthat dispatch through contract.ts, and deprecate top-level lang with\na stderr warning pointing to contract translate queue.",
          "is_bot": false,
          "headline": "feat(cli): add contract command group",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-26T04:11:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "13d7a1843eb1beedd0a89e16b07b6959f9ad56f4",
          "body": "Add contract_review, contract_comments, contract_prototype, contract_translate\ntools with action discriminator routing. Each tool gates on the corresponding\ncapability via assertToolAllowed. Keep old review_* and comments_* tools as\ndeprecation shims that emit a stderr warning and delegate to the same run*\nfunctions. Includes 8 contract-mcp tests covering unknown-action errors,\nCapabilityDisabledError, and gate-mcp mapping.",
          "is_bot": false,
          "headline": "feat(contract): add grouped contract_* MCP tools",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-26T04:09:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6c4889519c0e05e5b51bb55f1b79e9c9b5f72543",
          "body": null,
          "is_bot": false,
          "headline": "feat(cli): add work command group; deprecate task",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-26T04:02:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "43a7ec38ce0ccf262c7716ba9d05e7853bbb8209",
          "body": "- src/core/operations/work.ts: re-export layer mapping runWork* → runTask*;\n  runWorkCreate accepts kind \"change\" as alias for \"resolve\"\n- src/interfaces/mcp/tools/work.ts: MCP handlers for work_create/list/get/\n  update/approve_plan/record_step/pause/resume/complete/abandon\n- schemas.ts: WorkKindEn\n[…]\ntask.ts: deprecation stderr warns on all toolTask* handlers\n- tests/work/work-mcp.test.ts: 7 tests covering kind→change mapping, list,\n  and status; gate-mcp.ts already had work_* with null capability",
          "is_bot": false,
          "headline": "feat(work): add work_* MCP tools with task deprecation shims",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-26T03:59:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "158d0166f6aff78e75877448ac5b4663fea13a51",
          "body": null,
          "is_bot": false,
          "headline": "feat(engine): gate MCP tools by docops capabilities",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-26T03:54:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cd5ceb5c45d9100eae488ea42cf7bd3fb34d4f19",
          "body": "Update findProjectRoot to detect .docops/docops.config.json and\n.ai-spector/engine.json as valid project roots alongside legacy\ndocflow.config.json paths.\n\nRefactor loadDocflowConfig to synthesize a DocflowConfig from the\ndocops + engine 2-file model when no docflow.config.json is present,\nmapping l\n[…]\n.\nLegacy docflow.config.json paths continue to work unchanged.\n\nAdd tests/engine/project-context.test.ts to verify synthesis, legacy\nfallback, configFile pointing, and docType templatesPath selection.",
          "is_bot": false,
          "headline": "refactor(config): synthesize docflow config from docops + engine",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-26T03:52:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "52bfd38a1f73ccbf4b8ee0bb214524cc93b99ad2",
          "body": "Remove DOCOPS_DUAL_WRITE env flag and all dual-write machinery:\n- Delete src/core/docops/dual-write.ts\n- Remove docopsDualWriteEnabled() from docops/paths.ts (keep LEGACY_DOCOPS_PATHS for migrate/assess)\n- Simplify resolveCommentsWriteRoots, resolveReviewQueueWriteRoots, resolvePrototypeScreenMapRel\n[…]\not) async helper to comments/paths.ts\n- Add tests/docops/paths.test.ts asserting resolveCommentsWriteRoots returns no legacy\n- Update comment test fixtures to seed at .docops/comments/ (contract path)",
          "is_bot": false,
          "headline": "refactor(docops): remove dual-write; contract paths only",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-26T03:46:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dc8cf7e0a9f77fc236794ffb0dcc3c8ba9ebce2c",
          "body": "Add migrateFromDocflow() that splits legacy .ai-spector/docflow.config.json\ninto .docops/docops.config.json (via docopsConfigFromDocflow) and\n.ai-spector/engine.json (via writeEngineConfig). Wire --from-docflow flag\nto docops migrate CLI command.",
          "is_bot": false,
          "headline": "feat(docops): migrate docflow.config to contract + engine",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-26T03:40:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0f7d4e375ec040a9ad728b9a4aa7a71ca859249e",
          "body": null,
          "is_bot": false,
          "headline": "feat(engine): add capability gate helpers",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-26T03:38:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "12b837d79e5229759803cd6e6947a3a40cb178c4",
          "body": null,
          "is_bot": false,
          "headline": "feat(engine): add engine.json types and loader",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-26T03:37:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b36e6e7de27e497e2750b9af63b14eb4a795e147",
          "body": null,
          "is_bot": false,
          "headline": "update migrate",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-23T06:33:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dde0a4693d7647b73fe40b5a82a05ef4eaca08c7",
          "body": null,
          "is_bot": false,
          "headline": "update migration setup",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-23T04:45:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9a413661c5b4ae0d95a3792092bdb94d325a1298",
          "body": null,
          "is_bot": false,
          "headline": "update spector",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-22T10:31:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "100b0b924cf8fee11bd5ebf19357e6a0991c786f",
          "body": null,
          "is_bot": false,
          "headline": "docs: document docops status init migrate commands",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-22T09:01:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "930dec9aef0263649aa8282acf6cab46cf73a7f5",
          "body": null,
          "is_bot": false,
          "headline": "fix(docops): resolve duplicate enabled key in buildDocTypes",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-22T09:00:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9ce8710dd075e8f58873ac37fdf0d685ee88eb6e",
          "body": null,
          "is_bot": false,
          "headline": "feat(skills): add ai-spector-docops runbook for Writer contract",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-22T09:00:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0e18d4d94d68ffc0333be87705cc50475f75289f",
          "body": null,
          "is_bot": false,
          "headline": "refactor(init): delegate docops scaffold to initDocopsContract",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-22T08:59:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "33c224f18ac657f8cfe30a9b3dcc05d88561e356",
          "body": null,
          "is_bot": false,
          "headline": "feat(cli): add docops status and init commands",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-22T08:58:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e012d6944c339aee4e01b0018c7221932baffdce",
          "body": null,
          "is_bot": false,
          "headline": "feat(docops): migrate repair mode and auto template copy",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-22T08:57:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b2e973ec444c0d46cbe456164db29932de450bce",
          "body": null,
          "is_bot": false,
          "headline": "feat(docops): add Writer-ready initDocopsContract",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-22T08:54:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e7160667b45c943905a6dee334a93147f9e8983e",
          "body": null,
          "is_bot": false,
          "headline": "feat(docops): add project assessment for status command",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-22T08:52:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2632b7db18f0b5500db0f7b253fafb8b6a855e95",
          "body": null,
          "is_bot": false,
          "headline": "feat(docops): add template copy helpers",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-22T08:51:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3d6d992b4f2cc41705dfed85c8ae10b0381a1acc",
          "body": "Point manual template copy and DOCOPS_LEGACY_PATHS notes to the Writer\ncontract migration guide in kari-writer/contracts.",
          "is_bot": false,
          "headline": "docs: link migrate README to MIGRATION.md",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-22T08:16:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0c42f3fedabcd7ac70e06c1761230a48b014eaf4",
          "body": null,
          "is_bot": false,
          "headline": "feat: refactor ai spector",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-22T06:59:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "936a5ba80c0065944f065e69a16c889eb5c966ef",
          "body": null,
          "is_bot": false,
          "headline": "update config",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-22T04:19:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "376e3f619d7664cac7c558c4050df62630ef3feb",
          "body": null,
          "is_bot": false,
          "headline": "add change detector feature",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-19T08:44:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "55005667352d456d380dc564dcd6629a04a2480d",
          "body": "Document queue drift engine, enrichment fields, and --no-enrich flags.",
          "is_bot": false,
          "headline": "docs(drift): document queue enrichment in CHANGELOG and cli-reference",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-19T08:42:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "31d2fd9ddcbe90166df8d9f2bd9d787a9e01f4cd",
          "body": "Add --no-enrich to lang queue pending and review queue CLI; MCP schemas pass enrich flag.",
          "is_bot": false,
          "headline": "feat(drift): add --no-enrich for fast queue listing",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-19T08:41:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "50adbd66bee693056774bbb1abe9ed0973bf6bee",
          "body": "Review runbook documents enrichment.impact.review and enrich-on-read queue flow.",
          "is_bot": false,
          "headline": "docs(drift): document review queue enrichment",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-19T08:41:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d0a0a053b4616809ae122d8b670ff32b92ba5e36",
          "body": "Runbook reads enrichment.diff and impact buckets instead of legacy changes[].diff.",
          "is_bot": false,
          "headline": "docs(drift): update resolve-translation for enrichment",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-19T08:41:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4010684210f4bfe30a170d1bbb3a1edea099c9ae",
          "body": "Backfill gitRef from git log when anchors lack it, fall through to legacy\nsnapshot/content/inline diff when git diff is empty, and add enrich-legacy tests.",
          "is_bot": false,
          "headline": "feat(drift): harden legacy diff fallbacks",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-19T08:41:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ce6ecce4b84ecbc6471088d6c9ba63503a9a3446",
          "body": null,
          "is_bot": false,
          "headline": "test(drift): add review enrich and reconcile anchor tests",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-19T08:38:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dbf3f0ae5f1ff57de9e70c52c292f726723e5dda",
          "body": "Write baselineAnchor on internal quorum, wire enrichReviewJob into\nrunReviewQueue, purge legacy diffs/snapshots on resolve, and add\nwriteLegacySnapshots config flag.",
          "is_bot": false,
          "headline": "feat(drift): enrich review queue on read with baselineAnchor quorum",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-19T08:38:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "961b03c1a90ccd3de2cb7fe7fd0d8cc8452e77e9",
          "body": "Store git-anchored baseline on approval invalidation instead of eager\nsaveDiff; extend review types and config for the drift model.",
          "is_bot": false,
          "headline": "feat(drift): add baselineAnchor and defer review diff to enrich",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-19T08:38:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e0e4d8bce3c10777f346adf7292a37e070228a2d",
          "body": "Clear enrichment and strip legacy diff from resolved jobs; remove stored\nfingerprint content for origin, target, and change paths on resolve.",
          "is_bot": false,
          "headline": "feat(drift): purge legacy fingerprint content on translation resolve",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-19T08:36:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b7ad014f3f3e4cbfda36ea5f85fc45c107679ed0",
          "body": "Wire enrichTranslationJob into runLangQueuePending with git diff, graph\nimpact, and cached enrichment persisted on pending queue jobs.",
          "is_bot": false,
          "headline": "feat(drift): enrich translation jobs on pending read",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-19T08:35:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c451a3f97eb514ae5429a7673a23e601974b9a67",
          "body": "Replace eager inline diffs and fingerprint content snapshots with\nDocAnchor on reconcile; diff/lines fields become optional for legacy jobs.",
          "is_bot": false,
          "headline": "feat(drift): translation reconcile stores anchors only",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-19T08:33:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2c9534ac0d1197963e1ca1d9a763aff9817042a6",
          "body": null,
          "is_bot": false,
          "headline": "feat(drift): add resolveDiffFromAnchor and linkLayerDrift",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-19T08:32:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "63caeedfe291268055ca181d6aade344f8aa9bec",
          "body": null,
          "is_bot": false,
          "headline": "feat(drift): add DocAnchor and EnrichmentCache types",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-19T08:31:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f6bf3335ec0f22a26648e400d5992877c8c89f45",
          "body": "Covers shared enrich module, translation/review git anchors, lazy enrichment on queue read, and legacy migration.",
          "is_bot": false,
          "headline": "docs(drift): add queue drift engine implementation plan.",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-19T08:30:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "985de2310978c155b337b07ccfb83de162b5936b",
          "body": "Replaces file-based translation/review snapshots with shared hash + gitRef\nanchors, lazy diff/impact enrichment, and graph-aware agent handoff.",
          "is_bot": false,
          "headline": "Add queue drift engine design spec for git-anchored queue enrichment.",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-19T08:28:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9f0b2899015daf1275eea5f825adb0c82076c490",
          "body": null,
          "is_bot": false,
          "headline": "docs(sync): document sync snapshot and audit commands",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-19T08:08:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c8d6ab7ce5ee6da4014c361cc8a5c421d22abb53",
          "body": null,
          "is_bot": false,
          "headline": "feat(sync): workspace_check SYNC-001 drift hint",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-19T08:08:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "174cbaf79be303811b5674e77bd6564c44b4aeed",
          "body": null,
          "is_bot": false,
          "headline": "docs(sync): add ai-spector-sync-audit skill and router",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-19T08:06:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "13365e7faa5245d3ad9314d66b7070d044e22085",
          "body": null,
          "is_bot": false,
          "headline": "feat(sync): add sync_snapshot and sync_audit MCP tools",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-19T08:05:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b88f498816cbe372590dfd7fde8d4ed6abe75369",
          "body": null,
          "is_bot": false,
          "headline": "feat(sync): traceability gap scan in sync audit",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-19T08:04:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7c0df68c83354ec5e529950cc4f41f353c1fee19",
          "body": null,
          "is_bot": false,
          "headline": "feat(sync): merge graph impact for changed paths in audit",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-19T08:03:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4fa72d9d694b0e46362e517d2e03669171246c2e",
          "body": null,
          "is_bot": false,
          "headline": "feat(sync): add sync snapshot and audit CLI commands",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-19T08:01:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5b14ba4e82fe63237dce8a62a358891c122e69b7",
          "body": null,
          "is_bot": false,
          "headline": "feat(sync): implement sync audit hash and git diff",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-19T08:00:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d027c626eac573b99eb32cd5b37133c93dbd9729",
          "body": null,
          "is_bot": false,
          "headline": "feat(sync): implement sync snapshot command core",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-19T07:59:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8be1ed90d8cfc00fa827cb52e194e263294ec7ae",
          "body": null,
          "is_bot": false,
          "headline": "feat(sync): git ref resolution and per-path diff",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-19T07:59:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ee3e6d9c3f3ea24b86a64c27561ffbebd5d2fafc",
          "body": null,
          "is_bot": false,
          "headline": "feat(sync): discover design layers and diff file hashes",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-19T07:58:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a487104b0914816a232bf1330826b897ce049356",
          "body": null,
          "is_bot": false,
          "headline": "feat(sync): add baseline types and persistence",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-19T07:57:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0865a19420b22674e5cd2ded580cf2f79c66b5c4",
          "body": "Covers snapshot baseline, git-backed audit, graph impact merge, and agent skill in three phases.",
          "is_bot": false,
          "headline": "docs(sync): add layer sync audit implementation plan.",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-19T07:56:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5d7d34c557a8f3679379862ef96f5984f0b6ceaf",
          "body": "Defines snapshot baseline, git-backed drift detection, and agent handoff for SRS/BD/DD alignment checks.",
          "is_bot": false,
          "headline": "docs(sync): add layer sync audit design spec.",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-19T07:53:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d4f3dd42c4fb315cc32cbcf1d75cb3b29a10c6a2",
          "body": "Document backfill upstream docs, upstream graph impact, and agent scaffold\nupdates; bump package version to 0.8.90.",
          "is_bot": false,
          "headline": "chore(release): prepare v0.8.90 with derive-downstream changelog.",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-19T07:17:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d5acced373109e77cc7ab8a0113976a795976727",
          "body": "Mirror derive routing and syncUpstream guidance across Claude skills, document\n--direction both for basic/detail edits, and test adopt validate derive gap.",
          "is_bot": false,
          "headline": "docs(derive): sync Claude scaffold and after-doc-edit upstream impact.",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-19T07:09:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1b2e14d1e1ee5f73f374bb533cbd8ca97775c85c",
          "body": "Route backfill/derive phrases to the correct generate skills, tag extracted\nspecs with derive provenance, guard expand passes via priorDeriveTaskId, and\ndocument upstream sync and adopt handoff for the BD+DD-no-SRS scenario.",
          "is_bot": false,
          "headline": "feat(derive): polish routing, provenance, expand pass, and agent docs.",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-19T07:08:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5f567497d3a7570bab864763d42b67c8fbaeaa34",
          "body": "…ode.\n\nAdd sourceMode on generate tasks, workflow dependency checks, readiness\nprofile, upstream graph impact bucket, adopt handoff, and tests.",
          "is_bot": false,
          "headline": "feat(derive): backfill upstream docs via derive-downstream generate m…",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-19T07:04:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8f40ad687677ac66bd78cb34cc45aefed05c67ff",
          "body": "Phased tasks for sourceMode on generate, readiness profile, adopt handoff,\nand upstream graph impact per approved design spec.",
          "is_bot": false,
          "headline": "Add derive-downstream implementation plan.",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-19T06:54:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4fbd0e8fd30cd4a61e6d94280e0e8cf8b34d68ed",
          "body": "Documents sourceMode on generate tasks to extract SRS from existing basic\nand detail design, with optional expand pass and upstream impact hints.",
          "is_bot": false,
          "headline": "Add derive-downstream design spec for backfilling upstream docs.",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-19T06:52:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0cc2c2be3bf09ac415efd587b9139ad5237e4a21",
          "body": "…ng (v0.8.89)\n\nFix basic-design link parsing that produced phantom doc.bd.api-* nodes, index\nall markdown under SRS/BD/DD with dynamic paths, emit cross-doc references,\nand return the full index report on failure instead of throwing early.",
          "is_bot": false,
          "headline": "fix(index): doc-extract path slugs, index-all-md, and failure reporti…",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-19T06:09:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "11706dd586072ba60f278ce16e796632f35a4278",
          "body": "Add adopt as a first-class task kind with task_approve_adopt_plan and server\ngates on apply/bootstrap. Extend scan/plan to legacy detail-design paths and\nupdate routing, runbooks, and docs for the align-legacy-docs journey.",
          "is_bot": false,
          "headline": "feat(adopt): gated legacy alignment workflow with detail-design support",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-18T09:28:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fa5cb4acbbc8c4edc88fb6de7122ea18ecd6ed0e",
          "body": null,
          "is_bot": false,
          "headline": "add suppport for import template",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-18T08:43:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "340a20122bee3902b9df30f5560933d392b5017c",
          "body": "Centralize MCP tool names with CI registration checks, export import approve helpers from the SDK, and document MCP→CLI fallback paths when descriptors are stale or unavailable.",
          "is_bot": false,
          "headline": "Add template-import MCP parity tests and CLI fallbacks for import gates.",
          "author_name": "long",
          "author_login": null,
          "committed_at": "2026-06-18T08:39:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 0,
      "commits_last_year": 292,
      "latest_release_at": null,
      "latest_release_tag": null,
      "releases_from_tags": false,
      "days_since_last_push": 13,
      "active_weeks_last_year": 8,
      "days_since_latest_release": null,
      "mean_days_between_releases": null
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": false,
      "has_contributing": false,
      "health_percentage": 28,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "ai-spector",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "ai-spector",
            "cursor",
            "documentation",
            "srs",
            "traceability",
            "requirements",
            "software-design",
            "graph"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/ai-spector",
          "is_deprecated": false,
          "latest_version": "0.9.24",
          "repository_url": "https://github.com/milky-way-66/ai-spector",
          "versions_count": 151,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 5330,
          "first_published_at": "2026-05-07T11:08:39.919000Z",
          "latest_published_at": "2026-07-17T04:37:28.119000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 4
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 1,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": {
        "days": [
          {
            "date": "2026-06-09",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 1,
        "total_stars": 1
      },
      "open_issues_and_prs": 0
    },
    "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",
        "website/tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 83366,
      "source_files_sampled": 477,
      "oversized_source_files": 2,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md",
        "scaffold/claude/CLAUDE.md",
        "scaffold/prototype/CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 19319
    },
    "dependencies": {
      "manifests": [
        "package.json",
        "website/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": "@modelcontextprotocol/sdk",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.29.0"
        },
        {
          "name": "@types/mdast",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.0.4"
        },
        {
          "name": "ajv",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^8.17.1"
        },
        {
          "name": "ajv-formats",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.0.1"
        },
        {
          "name": "commander",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^12.1.0"
        },
        {
          "name": "rehype-stringify",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^10.0.1"
        },
        {
          "name": "remark-gfm",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.0.1"
        },
        {
          "name": "remark-parse",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^11.0.0"
        },
        {
          "name": "remark-rehype",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^11.1.2"
        },
        {
          "name": "semver",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.8.4"
        },
        {
          "name": "unified",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^11.0.5"
        },
        {
          "name": "unist-util-visit",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.1.0"
        },
        {
          "name": "zod",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.4.3"
        },
        {
          "name": "@docusaurus/core",
          "manifest": "website/package.json",
          "ecosystem": "npm",
          "version_constraint": "3.10.1"
        },
        {
          "name": "@docusaurus/faster",
          "manifest": "website/package.json",
          "ecosystem": "npm",
          "version_constraint": "3.10.1"
        },
        {
          "name": "@docusaurus/preset-classic",
          "manifest": "website/package.json",
          "ecosystem": "npm",
          "version_constraint": "3.10.1"
        },
        {
          "name": "@docusaurus/theme-mermaid",
          "manifest": "website/package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.10.1"
        },
        {
          "name": "@mdx-js/react",
          "manifest": "website/package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.0.0"
        },
        {
          "name": "clsx",
          "manifest": "website/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.0.0"
        },
        {
          "name": "prism-react-renderer",
          "manifest": "website/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.3.0"
        },
        {
          "name": "react",
          "manifest": "website/package.json",
          "ecosystem": "npm",
          "version_constraint": "^19.0.0"
        },
        {
          "name": "react-dom",
          "manifest": "website/package.json",
          "ecosystem": "npm",
          "version_constraint": "^19.0.0"
        },
        {
          "name": "unist-util-visit",
          "manifest": "website/package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.1.0"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 0,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": null,
      "bot_contributors": 0,
      "top_contributors": [],
      "contributors_sampled": null,
      "top_contributor_share": null
    },
    "quality_signals": {
      "has_ci": false,
      "has_tests": true,
      "ci_workflows": [],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "package-lock.json"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": null,
            "reason": "no pull request found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": null,
            "reason": "no workflows found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 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": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": null,
            "reason": "no dependencies found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "no SAST tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": null,
            "reason": "No tokens found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "27 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "db5a0362fd4eaf511ba450e7d97c1ce86c1a44ec",
        "ran_at": "2026-07-21T22:48:27Z",
        "aggregate_score": 1.5,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-08T05:25:28Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": null,
      "ci_last_conclusion": null,
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/milky-way-66/ai-spector",
    "host": "github.com",
    "name": "ai-spector",
    "owner": "milky-way-66"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "at_risk",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 34,
      "inputs": {
        "security": 15,
        "vitality": 32,
        "community": 33,
        "governance": 43,
        "engineering": 44
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "at_risk",
        "name": "Vitality",
        "value": 32,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 52,
            "inputs": {
              "commits_last_year": 292,
              "human_commit_share": 1,
              "days_since_last_push": 13,
              "active_weeks_last_year": 8
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 13 days ago",
                "points": 28.8,
                "status": "partial",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 13
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "8/52 weeks with commits",
                "points": 5.5,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 8
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "292 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 292
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "critical",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 1,
            "inputs": {
              "releases_count": 0
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "no releases published",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_releases_published",
                    "params": {}
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "no releases",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_releases",
                    "params": {}
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "no releases",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_releases",
                    "params": {}
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "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": 33,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 1,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "below_threshold"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "1 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 62,
            "inputs": {
              "packages": [
                "ai-spector"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 5330
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "5,330 downloads/month across npm",
                "points": 49.7,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 5330,
                      "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": 43,
        "weight": 0.24,
        "metrics": [
          {
            "key": "responsiveness",
            "band": "critical",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution, PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution",
                    "pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 1,
            "inputs": {
              "merged_prs": 0,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "no decided pull requests or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_decided_prs_or_data",
                    "params": {}
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 39,
            "inputs": {
              "followers": 1,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "milky-way-66",
              "public_repos": 9,
              "account_age_days": 2844
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "1 followers of milky-way-66",
                "points": 2.2,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 1,
                      "login": "milky-way-66"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "9 public repos, account ~7 yr old",
                "points": 19.3,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 9
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 7
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "ai-spector"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 4
            },
            "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 4 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 4
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "151 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 151
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "at_risk",
        "name": "Engineering Quality",
        "value": 44,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "at_risk",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 30,
            "inputs": {
              "has_ci": false,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 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": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 65,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "critical",
        "name": "Security",
        "value": 15,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "critical",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Dangerous-Workflow, Packaging, Pinned-Dependencies, Signed-Releases, Token-Permissions. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "dangerous_workflow",
                    "packaging",
                    "pinned_dependencies",
                    "signed_releases",
                    "token_permissions"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 15,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 12,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 6,
              "scorecard_aggregate": 1.5
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no workflows found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file 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 not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "no dependencies found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "no SAST tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "No tokens found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "27 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": 69,
        "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.87,
              "agent_instruction_files": [
                "AGENTS.md",
                "CLAUDE.md",
                "scaffold/claude/CLAUDE.md",
                "scaffold/prototype/CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 19319
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, CLAUDE.md, scaffold/claude/CLAUDE.md, scaffold/prototype/CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md, CLAUDE.md, scaffold/claude/CLAUDE.md, scaffold/prototype/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": "87 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 87,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "at_risk",
            "name": "Verify loop (build / test / typecheck)",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Pinned-Dependencies. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_pinned_dependencies"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 48,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "package-lock.json"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [
                "tsconfig.json",
                "website/tsconfig.json"
              ],
              "agent_commit_share": 0,
              "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, website/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "tsconfig.json, website/tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "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": "no dependencies found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "TypeScript",
              "largest_source_bytes": 83366,
              "source_files_sampled": 477,
              "oversized_source_files": 2
            },
            "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": "2/477 source files over 60KB",
                "points": 54.8,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 477,
                      "oversized": 2
                    }
                  }
                ],
                "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": [
    "Contributor list unavailable",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
    "deps.dev does not index npm:ai-spector@0.9.24; advisories assessed against the repository dependency graph instead"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-21T22:48:38.594518Z",
  "schema_version": "0.25.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/m/milky-way-66/ai-spector.svg",
  "full_name": "milky-way-66/ai-spector",
  "license_state": "standard",
  "license_spdx": "MIT"
}

Scores are signals, not warranties. They reflect publicly visible practices on GitHub — not a code audit, and not a security guarantee.

Missing data is excluded and weights renormalized, never scored as zero. Methodology is versioned and open: metrics v1.13.0, schema v0.25.0 — full methodology · metrics wiki.

How one result sits in the wider record: aggregate statisticsnpm.