Public record
Software health reportschema 0.26.0 · metrics 1.13.0 · 2026-07-22 02:12 UTC

2389-research / ccvault

GoMIT★ 10 stars⑂ 4 forkssince Feb 2026View on GitHub ↗

2389-research/ccvault holds a health index of 57 out of 100, placing it in the Moderate band. It scores highest on Engineering Quality (92/100) and lowest on Security (30/100). It was last updated 7 days ago. A single contributor accounts for most of its recent work.

57
overall / 100
Moderate

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.

57
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

2389 Research, IncOrganization
112 followers101 public repossince Apr 2024

This repository is backed by an organization — shared, accountable stewardship that can outlive any single maintainer.

Package ecosystems

RegistryPackageVersionDownloads / moVersionsLast publish
Gogithub.com/2389-research/ccvaultv0.2.0-942 days ago

Metrics by category

Vitality

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

69Moderate · 22% of overall
How it's scored
36/36Push recency — last push 7 days ago
2.1/36Commit cadence — 3/52 weeks with commits
16/18Commit volume — 60 commits in the last year
1/10OpenSSF Scorecard: Maintained — 2 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 1
Inputs used
commits_last_year60
human_commit_share1
days_since_last_push7
active_weeks_last_year3
How it's scored
27/27Ships releases — 9 releases published
36/36Release recency — latest release 15 days ago
27/27Release cadence — a release every ~17.8 days
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Inputs used
releases_count9
latest_release_tagv0.2.0
releases_from_tagsno
days_since_latest_release15
mean_days_between_releases17.8

Community & Adoption

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

34At risk · 18% of overall
How it's scored
15.5/60Stars — 10 stars
4/25Forks — 4 forks
0/15Watchers — 0 watchers
Inputs used
forks4
stars10
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

Sustainability & Governance

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

53Moderate · 24% of overall
How it's scored
9/54Bus factor — 1 contributor(s) cover half of all commits
9.7/22.5Commit distribution — top contributor authored 57% of commits
2.7/13.5Contributor breadth — 2 contributors
6/10OpenSSF Scorecard: Contributors — project has 2 contributing companies or organizations -- score normalized to 6
Inputs used
bus_factor1
contributors_sampled2
top_contributor_share0.567
How it's scored
15.6/46.8Issue resolution — 33% of issues closed
19.1/38.3PR acceptance — 1/2 decided PRs merged
3/15OpenSSF Scorecard: Code-Review — Found 1/4 approved changesets -- score normalized to 2
Inputs used
merged_prs1
open_issues4
closed_issues2
issue_closed_ratio0.333
closed_unmerged_prs1
How it's scored
30/30Ownership backing — organization-owned
0/20Verified domain
14.8/25Owner reach — 112 followers of 2389-research
17.6/25Track record — 101 public repos, account ~2 yr old
Inputs used
followers112
owner_typeOrganization
is_verified
owner_login2389-research
public_repos101
account_age_days833
How it's scored
25/25Published & resolvable — 1 package(s) on go
35/35Publish recency — latest publish 42 days ago
20/20Version history — 9 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packagesgithub.com/2389-research/ccvault
ecosystemsgo
any_deprecatedno
min_days_since_publish42

Engineering Quality

Are baseline engineering and documentation practices in place?

92Excellent · 20% of overall
How it's scored
24/24CI workflows — 2 workflow(s)
24/24Tests present
16/16Linter config
9.6/9.6Pre-commit hooks
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 1 out of 1 merged PRs checked by a CI test -- score normalized to 10
Inputs used
has_ciyes
has_testsyes
has_editorconfigno
has_linter_configyes
has_precommit_configyes

Documentation

90Excellent
How it's scored
30/30README
25/25Documentation directory
15/15Documentation / homepage site — https://2389-research.github.io/ccvault/
0/10Repository description
10/10Topics — 2 topics
10/10Wiki
Inputs used
topicsclaude, claude-code
has_wikiyes
homepagehttps://2389-research.github.io/ccvault/
has_readmeyes
has_docs_diryes
has_descriptionno

Security

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

30At risk · 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
2.5/2.5CI-Tests — 1 out of 1 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
1.5/7.5Code-Review — Found 1/4 approved changesets -- score normalized to 2
1.5/2.5Contributors — project has 2 contributing companies or organizations -- score normalized to 6
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5License — license file detected
0.8/7.5Maintained — 2 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 1
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 12 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate3

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.

86Excellent · 0% of overall
How it's scored
45/45Agent instructions — CLAUDE.md
0/15Machine-readable docs (llms.txt)
40/40Legible commit history — 58 of 60 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share0.967
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes1,594
How it's scored
18/18One-command bootstrap — Makefile, mise.toml
22/22Automated tests
11/11Lint / format config
11/11Static type checking — Go (statically typed)
10/10Reproducible environment — lockfile
10/10Demonstrated agent practice — 55 of the last 60 commits agent-authored or agent-credited
0/8Automated maintenance — no automated dependency updates observed
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Inputs used
has_nixno
has_testsyes
lockfilesgo.sum
has_dockerfileno
typed_languageyes
bootstrap_filesMakefile, mise.toml
has_devcontainerno
has_linter_configyes
typecheck_configs
agent_commit_share0.917
toolchain_manifestsgo.mod
dependency_bot_commit_share0
How it's scored
45/45Type-checkable code — Go (statically typed)
55/55Manageable file sizes — 0/48 source files over 60KB
Inputs used
primary_languageGo
largest_source_bytes37,551
source_files_sampled48
oversized_source_files0

Key facts

10GitHub stars
2contributors
60commits, last 12 months
7days since last push
9releases
1bus factor
4open issues
Gopackage ecosystems

Data collection warnings

  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

More detail

Star and fork history 10 ★ / 4 ⇿
10Stars
4Forks
9Releases

When each star and fork was added, collected from GitHub and bucketed by day. Cumulative growth sits directly above the daily additions it is made of, so the two read against each other: steady organic accretion looks nothing like an abrupt, short-lived burst. Where that difference is measurable, it is reported as growth authenticity.

024681010432026-022026-042026-07
Major 0Minor 1Patch 8
OpenSSF Scorecard 3.0 / 10
3.0aggregate

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-22 02:12 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
10CI-Tests1 out of 1 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
2Code-ReviewFound 1/4 approved changesets -- score normalized to 2
6Contributorsproject has 2 contributing companies or organizations -- score normalized to 6
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
1Maintained2 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 1
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities12 existing vulnerabilities detected
Direct dependencies 11
RegistryPackageVersion constraintManifest
Gogithub.com/atotto/clipboardv0.1.4go.mod
Gogithub.com/charmbracelet/bubblesv1.0.0go.mod
Gogithub.com/charmbracelet/bubbleteav1.3.10go.mod
Gogithub.com/charmbracelet/glamourv0.10.0go.mod
Gogithub.com/charmbracelet/lipglossv1.1.1-0.20250404203927-76690c660834go.mod
Gogithub.com/marcboeker/go-duckdbv1.8.5go.mod
Gogithub.com/spf13/cobrav1.10.2go.mod
Gogithub.com/spf13/viperv1.21.0go.mod
Gogithub.com/xitongsys/parquet-gov1.6.2go.mod
Gogithub.com/xitongsys/parquet-go-sourcev0.0.0-20241021075129-b732d2ac9c9bgo.mod
Gomodernc.org/sqlitev1.45.0go.mod
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": [
        "claude",
        "claude-code"
      ],
      "is_fork": false,
      "size_kb": 387,
      "has_wiki": true,
      "homepage": "https://2389-research.github.io/ccvault/",
      "languages": {
        "Go": 386928,
        "Makefile": 1290
      },
      "pushed_at": "2026-07-14T15:05:31Z",
      "created_at": "2026-02-14T03:57:58Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-12T03:29:15Z",
      "description": null,
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": "https://2389.ai",
      "name": "2389 Research, Inc",
      "type": "Organization",
      "login": "2389-research",
      "company": null,
      "location": "United States of America",
      "followers": 112,
      "avatar_url": "https://avatars.githubusercontent.com/u/166545110?v=4",
      "created_at": "2024-04-09T17:47:35Z",
      "is_verified": null,
      "public_repos": 101,
      "account_age_days": 833
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-07-06T21:07:01Z"
        },
        {
          "tag": "v0.1.8",
          "kind": "patch",
          "published_at": "2026-02-14T23:44:54Z"
        },
        {
          "tag": "v0.1.7",
          "kind": "patch",
          "published_at": "2026-02-14T15:11:15Z"
        },
        {
          "tag": "v0.1.6",
          "kind": "patch",
          "published_at": "2026-02-14T06:01:28Z"
        },
        {
          "tag": "v0.1.5",
          "kind": "patch",
          "published_at": "2026-02-14T05:08:34Z"
        },
        {
          "tag": "v0.1.4",
          "kind": "patch",
          "published_at": "2026-02-14T05:03:59Z"
        },
        {
          "tag": "v0.1.3",
          "kind": "patch",
          "published_at": "2026-02-14T04:39:56Z"
        },
        {
          "tag": "v0.1.2",
          "kind": "patch",
          "published_at": "2026-02-14T04:36:39Z"
        },
        {
          "tag": "v0.1.1",
          "kind": "patch",
          "published_at": "2026-02-14T04:33:49Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "b067bb373a091c48a55665fa8ec75257a7fab1da",
          "body": "feat: plugin architecture for multi-source session support",
          "is_bot": false,
          "headline": "Merge pull request #6 from 2389-research/feature/plugin-architecture",
          "author_name": "Harper Reed",
          "author_login": "harperreed",
          "committed_at": "2026-06-09T20:01:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f8d8565968333ec3b9f0eca9125d2bdda1737899",
          "body": "Walks through CodeRabbit's actionable comments on the plugin-architecture\nPR and adds the test coverage that was missing for the headline fixes.\n\nAdapter correctness:\n- claudecode: parse tool_result.is_error from structured payload instead of\n  substring-matching RawJSON (eliminates false positives \n[…]\nrce:hex filtering plus\n  unfiltered cross-source search\n\nIssues #8 (analytics) and #9 (tui) filed for the remaining coverage gaps.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: address PR #6 review feedback and shore up adapter tests",
          "author_name": "Dylan Richard",
          "author_login": "detour1999",
          "committed_at": "2026-06-04T17:09:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "796b7e2a14060a4ad3c239c7ef9c964056cf6bd5",
          "body": "Add Source to SessionRecord for Parquet export, and add two new\nsource-aware DuckDB queries: GetTokensBySource and GetSessionsBySource.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add source field to analytics SessionRecord and Parquet schema",
          "author_name": "Dylan Richard",
          "author_login": "detour1999",
          "committed_at": "2026-04-05T22:11:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "56630b7362d1e90bdad3f2a50d5f5ee51cf4b653",
          "body": "When a session has a source set (e.g. \"claude-code\", \"codex\", \"jeff\",\n\"hex\"), it now appears as a row in the metadata table of exported\nmarkdown files.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add Source row to markdown export metadata table",
          "author_name": "Dylan Richard",
          "author_login": "detour1999",
          "committed_at": "2026-04-05T22:11:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7e2cbd824d19abe6034e58b61977677dd0daed46",
          "body": "Add source to search_conversations results, get_session_summary, and\nexpose an optional source parameter on the search_conversations tool\nso MCP clients can filter by source. The list_sessions and list_projects\ntools already serialize the Source field from the model structs.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add source field to MCP search results and tool parameters",
          "author_name": "Dylan Richard",
          "author_login": "detour1999",
          "committed_at": "2026-04-05T22:09:59Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "48bf18a909060899b38b53ccd7bde19aa11b25bc",
          "body": "Allow users to sync only specific sources with `ccvault sync --source codex`.\nWhen not provided, all sources are synced (backward compatible). Also adds\n`source:<name>` to the orient command's search syntax documentation.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add --source flag to sync command and source filter to orient help",
          "author_name": "Dylan Richard",
          "author_login": "detour1999",
          "committed_at": "2026-04-05T22:08:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4e99fb858fa58817ae5cf49ecc531fc7468a6517",
          "body": "Add source column/field to projects list, sessions list, conversation\nheader, and search tips so users can see which AI tool produced each\nsession (e.g. claude-code, codex, jeff, hex).\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: thread source display through all TUI views",
          "author_name": "Dylan Richard",
          "author_login": "detour1999",
          "committed_at": "2026-04-05T22:06:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "08b7618c88aa170b16cb07c81bccedbbf19d6e8a",
          "body": "- Fix latent bug: increment argNum after source filter in search query builder\n- Remove claudecode blank import from sync package (belongs in main.go only)\n- Add migration 004: composite PK (path, source) on source_files to prevent\n  cross-source collisions\n- Extract duplicate makeCopy to shared ada\n[…]\nt full schema\n- Replace manual string search in migrator_test with strings.Contains\n- Document that projects aggregate across sources by design\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: address code review findings from PR #6",
          "author_name": "Dylan Richard",
          "author_login": "detour1999",
          "committed_at": "2026-04-03T20:25:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c2963b86c4a921c2b63b38bb66a4249a3056d56a",
          "body": "Register Jeff and Hex adapters via blank imports in main.go.\nAdd sync-real-jeff, sync-real-hex, and source-filtered-search-jeff\nscenarios to scenarios.jsonl. Update adapter-registry scenario to\ninclude all four adapter types.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: wire Jeff and Hex adapters, add scenario patterns",
          "author_name": "Dylan Richard",
          "author_login": "detour1999",
          "committed_at": "2026-04-03T18:34:18Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a0809befeac483bf9d99842b8c347e23857c19b4",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add Hex source adapter for agentic loop sessions",
          "author_name": "Dylan Richard",
          "author_login": "detour1999",
          "committed_at": "2026-04-03T18:29:51Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c7d96e3c44084aa2ffaf655835faa8aeb574fc20",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add Jeff source adapter for GSuite agentic loop sessions",
          "author_name": "Dylan Richard",
          "author_login": "detour1999",
          "committed_at": "2026-04-03T18:29:18Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4508579f39d2a35803135be08d401010d5fe5efc",
          "body": "Two new source adapters for Jeff (GSuite JSONL sessions) and\nHex (JSON conversation exports). No changes to existing infra.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add Jeff + Hex adapter design",
          "author_name": "Dylan Richard",
          "author_login": "detour1999",
          "committed_at": "2026-04-03T18:27:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "85553c0e2a3a53b2bcbb663b66f36cf25c3455c4",
          "body": "10 scenarios exercising real Claude Code + Codex sessions against\nreal SQLite, validating multi-source sync, search filtering,\nincremental sync, migration bootstrap, and FTS across sources.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: add scenario tests and scenarios.jsonl for plugin architecture",
          "author_name": "Dylan Richard",
          "author_login": "detour1999",
          "committed_at": "2026-04-03T15:48:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "17064cd22847ed785d702ef7327c2ea3f3ca9013",
          "body": "Verifies that Claude Code and Codex sessions are correctly synced into\nthe same database with proper source tagging, and that source: search\nfilters correctly isolate results by origin. Also registers the Codex\nadapter via blank import in main.go.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add end-to-end integration test for multi-source sync and search",
          "author_name": "Dylan Richard",
          "author_login": "detour1999",
          "committed_at": "2026-04-03T07:27:59Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "eaa622f92f0040e0a9dbfa2fab179b393455eff4",
          "body": "Implements SourceAdapter for discovering and parsing Codex JSONL session\nfiles from ~/.codex/sessions/. Handles session_meta, response_item\nmessages, function_call tool uses, turn_context model info, and\ntoken_count events.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add Codex source adapter for OpenAI Codex CLI sessions",
          "author_name": "Dylan Richard",
          "author_login": "detour1999",
          "committed_at": "2026-04-03T07:25:50Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6a77131731215f75d1bcb1a982c23b28db8de127",
          "body": "Add blank import of pkg/adapter/claudecode so its init() function\nruns at startup, registering the adapter with the global registry.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: register Claude Code adapter via blank import in main",
          "author_name": "Dylan Richard",
          "author_login": "detour1999",
          "committed_at": "2026-04-03T07:21:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1dcdbc96cf79f88d9d485fb330dffd7885b0773b",
          "body": "Enables filtering search results by source adapter (e.g., source:codex,\nsource:\"claude-code\") following the existing operator pattern.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add source: search filter for multi-source queries",
          "author_name": "Dylan Richard",
          "author_login": "detour1999",
          "committed_at": "2026-04-03T07:19:48Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "34b5e37372fdc2e99c0c362c5788bd91dbee58f5",
          "body": "…calls\n\nSyncer now accepts []config.SourceConfig instead of a claudeHome string,\niterates over configured sources, and uses the adapter registry to discover\nand parse session files. This enables multi-source syncing.\n\n- Update Syncer struct and New() constructor for source configs\n- Run() iterates s\n[…]\nby adapters)\n- Update all callers: main.go, tui/app.go, tui/syncing.go\n- Add comprehensive tests for multi-source, incremental, and error paths\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: sync layer uses adapter interface instead of direct parser …",
          "author_name": "Dylan Richard",
          "author_login": "detour1999",
          "committed_at": "2026-04-03T07:17:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "11a4f1d2526ded2d60808bf341d8134dd5d3c7eb",
          "body": "Update UpsertProject/Tx, UpsertSession/Tx, GetProject, GetProjectByPath,\nGetProjects, GetSession, and GetSessions to read/write the source column.\nGetAllSourceMtimes now accepts an optional source filter. UpsertSourceFileMtime/Tx\nincludes source with backward-compatible variadic parameter. All functions\ndefault to \"claude-code\" when source is empty for backward compatibility.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: wire source field through all DB operations",
          "author_name": "Dylan Richard",
          "author_login": "detour1999",
          "committed_at": "2026-04-03T07:08:41Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "75fd682614443888a8295887087ab688b60bf001",
          "body": "…ation 003)\n\nAdds a `source` column to distinguish data from different AI tools.\nExisting rows default to \"claude-code\". Includes indexes for efficient\nfiltering and tests for the new migration.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add source column to sessions, projects, and source_files (migr…",
          "author_name": "Dylan Richard",
          "author_login": "detour1999",
          "committed_at": "2026-04-03T07:04:53Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c37e48782244838d98128acbd3a09fb2c80b0139",
          "body": "Add SourceConfig struct and Sources field to Config. When no sources\nare explicitly configured, auto-creates a default claude-code source\nfrom ClaudeHome for backward compatibility. Add LoadFrom() for loading\nconfig from a specific file path.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add multi-source config with backward compatibility",
          "author_name": "Dylan Richard",
          "author_login": "detour1999",
          "committed_at": "2026-04-03T07:02:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8aca35e074e3b5675a8945f7c5fd96e284b462c6",
          "body": "Implements SourceAdapter for Claude Code JSONL sessions with error\ndetection (is_error in RawJSON), subagent detection (Task tool use),\nand tool use extraction. Self-registers via init().\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add Claude Code adapter wrapping existing parser and scanner",
          "author_name": "Dylan Richard",
          "author_login": "detour1999",
          "committed_at": "2026-04-03T06:59:08Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d653911940a94eb12855e74061601677183e3a49",
          "body": "Define the core abstraction for multi-source conversation parsing.\nSourceAdapter provides Discover/Parse methods that all source backends\nimplement. The registry allows adapters to self-register by name with\nthread-safe factory storage.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add SourceAdapter interface and adapter registry",
          "author_name": "Dylan Richard",
          "author_login": "detour1999",
          "committed_at": "2026-04-03T06:56:44Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "eed623e0ea513ced3780aa8f49ae24ca9d756bd5",
          "body": "These WriteString→Fprintf changes are valid but unrelated to the\nmigration system task.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "revert: remove unrelated fmt.Fprintf changes from migration commit",
          "author_name": "Dylan Richard",
          "author_login": "detour1999",
          "committed_at": "2026-04-03T06:55:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a9e189b62a2168ae7d783b7c44e9441732cf7b0c",
          "body": "Replace ad-hoc ALTER TABLE statements in db.init() with a proper\nversioned migration system. Migrations are embedded SQL files applied\nin order with version tracking via schema_version table. Supports\nbootstrapping from pre-migrator databases by detecting existing state.\n\nIncludes golangci-lint auto-fixes for perfsprint in server.go and\nsyncing.go (unrelated but required to pass pre-commit hooks).\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add versioned migration system for database schema evolution",
          "author_name": "Dylan Richard",
          "author_login": "detour1999",
          "committed_at": "2026-04-03T06:52:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c98fe82e8a68ead9e30dfa3cb51e6e7a1eabf369",
          "body": "11 tasks covering migration system, adapter interface, Claude Code\nadapter, multi-source config, DB schema changes, sync refactor,\nsearch filter, CLI wiring, Codex adapter, and integration tests.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add plugin architecture implementation plan",
          "author_name": "Dylan Richard",
          "author_login": "detour1999",
          "committed_at": "2026-04-03T06:41:20Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d116d0a3b7c3f63dbb93673fb0e897421d29e2ac",
          "body": "Defines adapter interface, registry, config, migration system,\nand sync changes to support Claude Code, Codex, Gemini, and\ncustom agentic loop session formats.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add plugin architecture design for multi-source support",
          "author_name": "Dylan Richard",
          "author_login": "detour1999",
          "committed_at": "2026-04-03T06:17:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "518ea3fce94c04cc28ed8961b077f3ef9213c31b",
          "body": "Project paths with dashes (e.g. \"canvas-plugins\") were incorrectly\ndecoded as \"canvas/plugins\" because decodeProjectPath naively replaces\nall dashes with slashes. Now extracts the cwd field from JSONL turns\nas ground truth, falling back to the lossy scanner decode only when\ncwd is missing.\n\n- Extrac\n[…]\n Add parser tests for CWD extraction, lock-to-first, git branch\n- Add sync integration tests for CWD preference and incremental sync\n\nCloses #2\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: extract CWD from JSONL for correct project path decoding",
          "author_name": "Harper Reed",
          "author_login": "harperreed",
          "committed_at": "2026-02-14T23:30:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "18b3db0e75f7492aac79656a3fdeee87b43ca573",
          "body": "- Updated styling variables for a lighter color scheme 💡\n- Added Open Graph and Twitter meta tags for better social sharing 🌐\n- Removed unused hero canvas and grid for a sleeker look ❌🌌\n- Adjusted element sizes and spacing for improved layout symmetry 📏\n- Simplified installations and documentation s\n[…]\nmore engaging while ensuring responsiveness across different devices. The focus on a light color palette also improves readability, so users can find their way around without straining their eyes! 🕶️💖",
          "is_bot": false,
          "headline": "Refactor index.html for a bright and clean design 🌟💥",
          "author_name": "Harper Reed",
          "author_login": "harperreed",
          "committed_at": "2026-02-14T18:33:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7c3ec913123992bde205daa9a1d3e2f4d9676c45",
          "body": "Instead of showing \"Run 'ccvault build-cache' first\" in the TUI,\nauto-build the parquet cache on first analytics view load.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: auto-build analytics cache when parquet file is missing",
          "author_name": "Harper Reed",
          "author_login": "harperreed",
          "committed_at": "2026-02-14T18:32:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bb4245ee7af9f40763e63d6695d5c939606d4520",
          "body": "…rror/has:subagent search\n\nAdd \"Sync Conversations\" to the TUI dashboard with a progress bar using\ngoroutine+channel pattern for non-blocking UI updates. Optimize incremental\nsync from 30s to ~1s by batch-loading mtimes and tracking all processed files\n(including empty sessions) in a new source_files table. Wire has:error and\nhas:subagent search operators using boolean session flags set during sync\nwith partial indexes for fast queries.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add interactive TUI sync, optimize incremental sync, wire has:e…",
          "author_name": "Harper Reed",
          "author_login": "harperreed",
          "committed_at": "2026-02-14T16:14:33Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e231694894ca414342ce3219d551ce475ea97ab5",
          "body": "Added an image to the README and updated features section.",
          "is_bot": false,
          "headline": "Update README with image and feature details",
          "author_name": "Harper Reed",
          "author_login": "harperreed",
          "committed_at": "2026-02-14T15:56:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "375674ff09c6ff57726ca1ad8857110acf0f6d2f",
          "body": null,
          "is_bot": false,
          "headline": "Add MIT License to the project",
          "author_name": "Harper Reed",
          "author_login": "harperreed",
          "committed_at": "2026-02-14T15:55:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "14618059bd03e2e5fe3cd6764fee34fdb5b32be5",
          "body": "JOIN sessions with projects table in GetSessions query so the\nexisting project_path field on the Session model gets populated.\nEliminates N+1 CLI calls for consumers that need project context.\n\nCloses #1\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: include project_path in list-sessions JSON output",
          "author_name": "Harper Reed",
          "author_login": "harperreed",
          "committed_at": "2026-02-14T15:09:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c827f00a21b31c3fb95c6d037588efe295d10ff7",
          "body": "- Added **pkg/models/** to highlight the new data structures used in the project 💡\n- Included **internal/config/** for configuration management, keeping things tidy like a well-organized sock drawer 🧦\n- Added **internal/sync/** to outline the incremental sync logic—because nobody likes stale data, r\n[…]\ner for all those document lovers out there 📄❤️\n\nThese additions clarify project structure and enhance the documentation for new devs, making it a breeze to navigate through the code. Happy coding! 🤓💻🎉",
          "is_bot": false,
          "headline": "Update CLAUDE.md with additional key components and directories 🌟✨",
          "author_name": "Harper Reed",
          "author_login": "harperreed",
          "committed_at": "2026-02-14T06:32:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cb2985723dc7285c65111cf6668c51c9692207f3",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: link ccvault skill from README",
          "author_name": "Harper Reed",
          "author_login": "harperreed",
          "committed_at": "2026-02-14T06:31:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "247ecca1325f312cdd8702d00601590889e585bb",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: add has:error/has:subagent caveat to SKILL.md anti-patterns",
          "author_name": "Harper Reed",
          "author_login": "harperreed",
          "committed_at": "2026-02-14T06:29:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "50b26c6a59c7de2c8ee61f358b25f9028b1264f4",
          "body": "- Mark has:error and has:subagent as parsed but not yet wired\n- Clarify tool: filter is case-sensitive with non-exhaustive examples\n- Note list_sessions returns error (not empty) on no project match\n- Clarify 500 chars each for session summary messages\n- Replace broken has:error/has:agent recipes with working examples\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: correct reference.md accuracy per code review",
          "author_name": "Harper Reed",
          "author_login": "harperreed",
          "committed_at": "2026-02-14T06:29:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f8e65bde6e7bc2c5d68358a03bec06a64b36d0b1",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add ccvault orient and recall workflow prompts",
          "author_name": "Harper Reed",
          "author_login": "harperreed",
          "committed_at": "2026-02-14T06:26:21Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e842e3bab8310792bc2cee20f484bc0879cb9acf",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add ccvault skill core strategy guide",
          "author_name": "Harper Reed",
          "author_login": "harperreed",
          "committed_at": "2026-02-14T06:24:05Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "efb628d2f647d1b1d2a94147b929d866d24aa180",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add ccvault skill reference card with tool/query docs",
          "author_name": "Harper Reed",
          "author_login": "harperreed",
          "committed_at": "2026-02-14T06:20:17Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1c9c531e40187e4b4c6bb949f58f4572e4025e7c",
          "body": "- quickstart: Interactive guide for humans, syncs if needed, shows next steps\n- orient: Database state summary for AI agents with --json flag for\n  machine-readable output including stats, recent projects, models, and\n  available commands\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add quickstart and orient commands",
          "author_name": "Harper Reed",
          "author_login": "harperreed",
          "committed_at": "2026-02-14T06:05:20Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3114818dfd204a4c988f9ca2223364d6d8c1f749",
          "body": "Add Homebrew, go install, and build from source installation methods.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: expand installation instructions",
          "author_name": "Harper Reed",
          "author_login": "harperreed",
          "committed_at": "2026-02-14T06:01:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2299eb03084bcef3cac250c0535c784432957648",
          "body": "- TUI now detects when sync has never happened or is stale (>24 hours)\n  and automatically triggers a sync on startup\n- Added SyncingView to display sync progress in the TUI\n- Fixed MCP search SQL error when searching for hyphenated terms like\n  \"tree-sitter\" by properly escaping FTS5 queries with s\n[…]\ncharacters\n- Terms containing hyphens, asterisks, carets, or parentheses are now\n  quoted to search them literally instead of as FTS5 operators\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add auto-sync detection and fix FTS5 hyphenated term search",
          "author_name": "Harper Reed",
          "author_login": "harperreed",
          "committed_at": "2026-02-14T05:51:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a6f13cf201080ee2514aaa42bbc22471706c9b05",
          "body": "- Add TUI analytics view with DuckDB-powered statistics\n  - Summary, Daily Usage (90 days), Top Projects (20), By Model tabs\n  - Scrollable viewport with keyboard and mouse support\n  - Rank numbers on top projects\n- Add clipboard copy support in conversation view (press 'c')\n- Fix DuckDB queries to \n[…]\ndd test coverage for config, search, export, and models packages\n- Fix potential panics: negative width in glamour, index bounds in shortenPath\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add DuckDB analytics view, copy/paste support, and tests",
          "author_name": "Harper Reed",
          "author_login": "harperreed",
          "committed_at": "2026-02-14T05:39:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e3223f880428f638f7bada176fe5ab36e8754a2a",
          "body": "- get_session_summary: Quick overview with stats, tools used, first/last messages\n- get_turns: Paginated access to turns with offset/limit (max 50)\n- get_session: Now warns for large sessions (>100 turns), suggests using summary+turns\n- All results are compact with truncated content to avoid token limits\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add get_session_summary and get_turns MCP tools",
          "author_name": "Harper Reed",
          "author_login": "harperreed",
          "committed_at": "2026-02-14T05:05:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d4b2845369d5a9f95571bfb6ea7756b65ef38e25",
          "body": "- Add offset parameter for pagination\n- Limit results to 10 per page (max 50)\n- Return compact results with truncated snippets (200 chars)\n- Include next_offset and has_more for cursor-style pagination\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add pagination to MCP search, return compact results",
          "author_name": "Harper Reed",
          "author_login": "harperreed",
          "committed_at": "2026-02-14T05:01:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "adea718e491cf36a3d113f55002920c029d9a8a5",
          "body": "Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: limit test-coverage to packages with tests",
          "author_name": "Harper Reed",
          "author_login": "harperreed",
          "committed_at": "2026-02-14T04:38:19Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a070e59b69d060e5900f5535175dff55d687b626",
          "body": "Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: remove Linux ARM64 build (CGO cross-compile issues with DuckDB)",
          "author_name": "Harper Reed",
          "author_login": "harperreed",
          "committed_at": "2026-02-14T04:37:45Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8ae401b676934a734d01c27c9fa88afb6d569c09",
          "body": "- Fix staticcheck QF1001 in scanner.go\n- Add test-race and test-coverage Makefile targets\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: apply De Morgan's law and add test-race target",
          "author_name": "Harper Reed",
          "author_login": "harperreed",
          "committed_at": "2026-02-14T04:34:17Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5b2a95d688801de4deb810ad839e7c32c5239640",
          "body": "Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: update homebrew tap to 2389-research/homebrew-tap",
          "author_name": "Harper Reed",
          "author_login": "harperreed",
          "committed_at": "2026-02-14T04:29:54Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1d09ae9ab26d8f41d4971a82f3dd8f46df584f38",
          "body": "- Add markdown export for sessions (CLI command and TUI shortcut e/x)\n- Render markdown in conversation view using glamour\n- Enhance dashboard with models used, tokens per model, date span\n- Update header to \"Claude Code Conversation Archive\"\n- Rewrite MCP server with 6 tools and 6 prompts\n- Rename \n[…]\nith full-text search\n- Fix backspace in search view\n- Add CI workflow, release workflow, goreleaser config\n- Add pre-commit hooks configuration\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add markdown export, MCP prompts, and CI/CD configuration",
          "author_name": "Harper Reed",
          "author_login": "harperreed",
          "committed_at": "2026-02-14T04:07:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "477a7d4343cee561af98d517f579177688e86e46",
          "body": "- Add internal/tui/styles.go with Lip Gloss styling\n- Add internal/tui/app.go with main program and view management\n- Add internal/tui/dashboard.go with stats and navigation menu\n- Add internal/tui/projects.go for browsing projects\n- Add internal/tui/sessions.go for viewing sessions\n- Add internal/t\n[…]\nst filtered by project\n- Conversation view with scrolling viewport\n- Keyboard navigation (j/k, arrows, pgup/pgdn)\n- Back navigation with escape\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: implement Bubble Tea TUI for interactive browsing",
          "author_name": "Harper Reed",
          "author_login": "harperreed",
          "committed_at": "2026-02-14T00:17:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "653a6e7fd62b53badd0fe90598927355370f7b93",
          "body": "- Add internal/search/query.go for parsing Gmail-style search syntax\n- Add internal/search/search.go for executing FTS5 searches\n- Implement ccvault search with project:, model:, tool: filters\n- Implement ccvault stats showing archive statistics\n- Implement ccvault list-projects with sorting options\n[…]\nds conversations by content and filters\n- Stats shows 291 projects, 2184 sessions, 27M tokens\n- List and show commands display formatted output\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: implement search, stats, list, and show commands",
          "author_name": "Harper Reed",
          "author_login": "harperreed",
          "committed_at": "2026-02-14T00:10:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0ed2213c0d08191581bbb63ed20487444bd2a378",
          "body": "- Add internal/config/config.go for configuration management\n- Add internal/sync/sync.go with incremental sync logic\n- Wire up ccvault sync command with --full and --verbose flags\n- Track file modification times for incremental updates\n\nTested with real data:\n- Full sync: 2250 sessions, 502K turns, 30K tool uses in 1.5min\n- Incremental sync: 69 changed sessions in 10 seconds\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: implement sync command for indexing conversations",
          "author_name": "Harper Reed",
          "author_login": "harperreed",
          "committed_at": "2026-02-14T00:07:02Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6fe1e2b43f5a5d35363e8f8aed9248ed8eff49ac",
          "body": "- Add internal/db/schema.sql with all tables and FTS5 search\n- Add internal/db/db.go for connection management and transactions\n- Add internal/db/projects.go for project CRUD operations\n- Add internal/db/sessions.go for session CRUD operations\n- Add internal/db/turns.go for turn storage and full-tex\n[…]\n FTS5 full-text search on turn content\n- Automatic FTS sync via triggers\n- Tool usage tracking\n- Token usage aggregation\n\nAll 20 tests passing.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add database layer with SQLite and FTS5",
          "author_name": "Harper Reed",
          "author_login": "harperreed",
          "committed_at": "2026-02-13T23:51:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "572250c1be580fb64e32a5777141bc3f94b99882",
          "body": "- Add pkg/models/models.go with Project, Session, Turn, ToolUse structs\n- Add pkg/parser/parser.go for parsing session JSONL files\n- Add pkg/parser/scanner.go for discovering session files\n- Add comprehensive tests for parser functionality\n\nAll tests passing. Parser handles:\n- User messages with con\n[…]\naction\n- Assistant messages with token usage\n- Tool use detection and file path extraction\n- Project path decoding from URL-encoded directories\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add data models and JSONL parser",
          "author_name": "Harper Reed",
          "author_login": "harperreed",
          "committed_at": "2026-02-13T23:46:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "160bf8baa8685dcc517c88ac752d9a8225373baa",
          "body": "- Add cmd/ccvault/main.go with all command stubs\n- Fix .gitignore to not ignore cmd/ccvault directory\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add CLI entry point and fix gitignore",
          "author_name": "Harper Reed",
          "author_login": "harperreed",
          "committed_at": "2026-02-13T23:44:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "066598617b2386129e134b30af1daab09be350fa",
          "body": "- Initialize Go module github.com/2389-research/ccvault\n- Add core dependencies (cobra, viper, sqlite, bubbletea, lipgloss)\n- Create directory structure per design doc\n- Implement CLI skeleton with all planned commands\n- Add .gitignore for Go projects\n\nAll commands are stubbed and ready for implementation.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: initialize project scaffolding with CLI structure",
          "author_name": "Harper Reed",
          "author_login": "harperreed",
          "committed_at": "2026-02-13T23:44:16Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c43cca6a7f2aec1b6a2290ce341724c9f738f4fe",
          "body": "Design for Claude Code conversation vault tool, mirroring msgvault's\narchitecture. Covers data model, storage, CLI commands, TUI, search\nsyntax, and MCP server integration.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add ccvault design document",
          "author_name": "Harper Reed",
          "author_login": "harperreed",
          "committed_at": "2026-02-13T23:41:05Z",
          "body_truncated": false,
          "is_coding_agent": true
        }
      ],
      "releases_count": 9,
      "commits_last_year": 60,
      "latest_release_at": "2026-07-06T21:07:01Z",
      "latest_release_tag": "v0.2.0",
      "releases_from_tags": false,
      "days_since_last_push": 7,
      "active_weeks_last_year": 3,
      "days_since_latest_release": 15,
      "mean_days_between_releases": 17.8
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": false,
      "has_contributing": false,
      "health_percentage": 37,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/2389-research/ccvault",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/2389-research/ccvault",
          "is_deprecated": false,
          "latest_version": "v0.2.0",
          "repository_url": "https://github.com/2389-research/ccvault",
          "versions_count": 9,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-06-09T20:01:27Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 42
        }
      ]
    },
    "popularity": {
      "forks": 4,
      "stars": 10,
      "watchers": 0,
      "fork_history": {
        "days": [
          {
            "date": "2026-02-14",
            "count": 1
          },
          {
            "date": "2026-02-16",
            "count": 1
          },
          {
            "date": "2026-04-08",
            "count": 1
          },
          {
            "date": "2026-04-24",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 4,
        "total_forks": 4
      },
      "star_history": {
        "days": [
          {
            "date": "2026-02-14",
            "count": 3
          },
          {
            "date": "2026-02-15",
            "count": 1
          },
          {
            "date": "2026-02-16",
            "count": 1
          },
          {
            "date": "2026-02-22",
            "count": 1
          },
          {
            "date": "2026-03-06",
            "count": 1
          },
          {
            "date": "2026-04-08",
            "count": 1
          },
          {
            "date": "2026-05-30",
            "count": 1
          },
          {
            "date": "2026-07-12",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 10,
        "total_stars": 10
      },
      "open_issues_and_prs": 6
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "Makefile",
        "mise.toml"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "go.mod"
      ],
      "largest_source_bytes": 37551,
      "source_files_sampled": 48,
      "oversized_source_files": 0,
      "agent_instruction_files": [
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 1594
    },
    "dependencies": {
      "manifests": [
        "go.mod"
      ],
      "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": [
        "go"
      ],
      "dependencies": [
        {
          "name": "github.com/atotto/clipboard",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.1.4"
        },
        {
          "name": "github.com/charmbracelet/bubbles",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.0.0"
        },
        {
          "name": "github.com/charmbracelet/bubbletea",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.3.10"
        },
        {
          "name": "github.com/charmbracelet/glamour",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.10.0"
        },
        {
          "name": "github.com/charmbracelet/lipgloss",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.1.1-0.20250404203927-76690c660834"
        },
        {
          "name": "github.com/marcboeker/go-duckdb",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.8.5"
        },
        {
          "name": "github.com/spf13/cobra",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.10.2"
        },
        {
          "name": "github.com/spf13/viper",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.21.0"
        },
        {
          "name": "github.com/xitongsys/parquet-go",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.6.2"
        },
        {
          "name": "github.com/xitongsys/parquet-go-source",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.0-20241021075129-b732d2ac9c9b"
        },
        {
          "name": "modernc.org/sqlite",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.45.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": 2,
        "merged_prs": 1,
        "open_issues": 4,
        "closed_ratio": 0.333,
        "closed_issues": 2,
        "closed_unmerged_prs": 1
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "harperreed",
          "commits": 34,
          "avatar_url": "https://avatars.githubusercontent.com/u/18504?v=4"
        },
        {
          "type": "User",
          "login": "detour1999",
          "commits": 26,
          "avatar_url": "https://avatars.githubusercontent.com/u/54019?v=4"
        }
      ],
      "contributors_sampled": 2,
      "top_contributor_share": 0.567
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "release.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": true
    },
    "security_signals": {
      "lockfiles": [
        "go.sum"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "1 out of 1 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 2,
            "reason": "Found 1/4 approved changesets -- score normalized to 2",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 6,
            "reason": "project has 2 contributing companies or organizations -- score normalized to 6",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 1,
            "reason": "2 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 1",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "12 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "b067bb373a091c48a55665fa8ec75257a7fab1da",
        "ran_at": "2026-07-22T02:12:19Z",
        "aggregate_score": 3,
        "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-06T21:08:58Z",
      "oldest_open_prs": [
        {
          "number": 3,
          "created_at": "2026-02-15T00:04:05Z",
          "last_comment_at": "2026-02-18T22:39:27Z",
          "last_comment_author": "beaugunderson"
        },
        {
          "number": 10,
          "created_at": "2026-07-14T15:07:40Z",
          "last_comment_at": "2026-07-14T15:07:57Z",
          "last_comment_author": "coderabbitai"
        }
      ],
      "last_merged_pr_at": "2026-06-09T20:01:27Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 5,
          "created_at": "2026-02-16T17:08:23Z",
          "last_comment_at": "2026-05-28T00:16:39Z",
          "last_comment_author": "Snailflyer"
        },
        {
          "number": 7,
          "created_at": "2026-04-14T06:18:57Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 8,
          "created_at": "2026-06-04T17:07:02Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 9,
          "created_at": "2026-06-04T17:07:10Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/2389-research/ccvault",
    "host": "github.com",
    "name": "ccvault",
    "owner": "2389-research"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 57,
      "inputs": {
        "security": 30,
        "vitality": 69,
        "community": 34,
        "governance": 53,
        "engineering": 92
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "moderate",
        "name": "Vitality",
        "value": 69,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "commits_last_year": 60,
              "human_commit_share": 1,
              "days_since_last_push": 7,
              "active_weeks_last_year": 3
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 7 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 7
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "3/52 weeks with commits",
                "points": 2.1,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 3
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "60 commits in the last year",
                "points": 16,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 60
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "2 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 1",
                "points": 1,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 9,
              "latest_release_tag": "v0.2.0",
              "releases_from_tags": false,
              "days_since_latest_release": 15,
              "mean_days_between_releases": 17.8
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "9 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 9
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 15 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 15
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~17.8 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 17.8
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 34,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 20,
            "inputs": {
              "forks": 4,
              "stars": 10,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "below_threshold"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "10 stars",
                "points": 15.5,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 10
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "4 forks",
                "points": 4,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "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
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 53,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 27,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 2,
              "top_contributor_share": 0.567
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 57% of commits",
                "points": 9.7,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 57
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "2 contributors",
                "points": 2.7,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 2 contributing companies or organizations -- score normalized to 6",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "at_risk",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 38,
            "inputs": {
              "merged_prs": 1,
              "open_issues": 4,
              "closed_issues": 2,
              "issue_closed_ratio": 0.333,
              "closed_unmerged_prs": 1
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "33% of issues closed",
                "points": 15.6,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 33
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "1/2 decided PRs merged",
                "points": 19.1,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 1,
                      "decided": 2
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 1/4 approved changesets -- score normalized to 2",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 62,
            "inputs": {
              "followers": 112,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "2389-research",
              "public_repos": 101,
              "account_age_days": 833
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "112 followers of 2389-research",
                "points": 14.8,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 112,
                      "login": "2389-research"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "101 public repos, account ~2 yr old",
                "points": 17.6,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 101
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 2
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "github.com/2389-research/ccvault"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 42
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on go",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "go"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 42 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 42
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "9 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 9
                    }
                  }
                ],
                "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": "excellent",
        "name": "Engineering Quality",
        "value": 92,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "excellent",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 94,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": true
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "2 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "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": 16,
                "status": "met",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 9.6,
                "status": "met",
                "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": "1 out of 1 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "topics": [
                "claude",
                "claude-code"
              ],
              "has_wiki": true,
              "homepage": "https://2389-research.github.io/ccvault/",
              "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": "https://2389-research.github.io/ccvault/",
                "points": 15,
                "status": "met",
                "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": "2 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 30,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": null,
            "notes": [],
            "value": 30,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 18,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 0,
              "scorecard_aggregate": 3
            },
            "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": "1 out of 1 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 1/4 approved changesets -- score normalized to 2",
                "points": 1.5,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 2 contributing companies or organizations -- score normalized to 6",
                "points": 1.5,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "2 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 1",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "12 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 4
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "excellent",
        "name": "AI Readiness",
        "value": 86,
        "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.967,
              "agent_instruction_files": [
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 1594
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "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": "58 of 60 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 58,
                      "sampled": 60
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 82,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [
                "Makefile",
                "mise.toml"
              ],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [],
              "agent_commit_share": 0.917,
              "toolchain_manifests": [
                "go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Makefile, mise.toml",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Makefile, mise.toml"
                    }
                  }
                ],
                "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": 11,
                "status": "met",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "Go (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "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": "55 of the last 60 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 55,
                      "sampled": 60
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 37551,
              "source_files_sampled": 48,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Go (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/48 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 48,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "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": [
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-22T02:12:33.961211Z",
  "schema_version": "0.26.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/2/2389-research/ccvault.svg",
  "full_name": "2389-research/ccvault",
  "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.26.0 — full methodology · metrics wiki.

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