Public record
Software health reportschema 0.27.0 · metrics 1.13.0 · 2026-07-24 00:15 UTC

oinam / ovellum

Write what matters, generate the rest - open source documentation where both live together.

TypeScriptMIT★ 1 star⑂ 0 forkssince May 2026View on GitHub ↗

oinam/ovellum holds a health index of 62 out of 100, placing it in the Moderate band. It scores highest on Engineering Quality (93/100) and lowest on Security (27/100). It was last updated 5 days ago. A single contributor accounts for most of its recent work.

62
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.

62
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

OinamOrganization
3 followers99 public repossince Aug 2010

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

Package ecosystems

RegistryPackageVersionDownloads / moVersionsLast publishTags
npmovellum0.25.03,095295 days agodocumentationdocstypescriptjavascriptmarkdownmdxstatic-site-generatorapi-docstsdocjsdocsite-generator

Metrics by category

Vitality

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

77Good · 22% of overall
How it's scored
36/36Push recency — last push 5 days ago
7.6/36Commit cadence — 11/52 weeks with commits
18/18Commit volume — 312 commits in the last year
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Inputs used
commits_last_year312
human_commit_share1
days_since_last_push5
active_weeks_last_year11

Release discipline

100Excellent
How it's scored
27/27Ships releases — 27 releases published
36/36Release recency — latest release 5 days ago
27/27Release cadence — a release every ~2.5 days
0/10OpenSSF Scorecard: Signed-Releases — no data
Inputs used
releases_count27
latest_release_tagovellum@0.25.0
releases_from_tagsno
days_since_latest_release5
mean_days_between_releases2.5
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.

Community & Adoption

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

42At risk · 18% of overall
How it's scored
0/60Stars — 1 stars
0/25Forks — 0 forks
0/15Watchers — 1 watchers
Inputs used
forks0
stars1
watchers1
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
How it's scored
22.5/22.5README
22.5/22.5License — recognized license (MIT)
18/18CONTRIBUTING guide
0/13.5Code of conduct
0/7.2Issue template
6.3/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
has_contributingyes
has_issue_templateno
has_code_of_conductno
has_pull_request_templateyes
How it's scored
46.5/80Monthly downloads — 3,095 downloads/month across npm
0/20Registry dependents — not reported by this ecosystem
Inputs used
packagesovellum
dependents
ecosystemsnpm
total_downloads
monthly_downloads3,095
Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.

Sustainability & Governance

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

59Moderate · 24% of overall
How it's scored
9/54Bus factor — 1 contributor(s) cover half of all commits
0/22.5Commit distribution — top contributor authored 100% of commits
1.4/13.5Contributor breadth — 1 contributors
10/10OpenSSF Scorecard: Contributors — project has 3 contributing companies or organizations -- score normalized to 10
Inputs used
bus_factor1
contributors_sampled1
top_contributor_share1
How it's scored
0/46.8Issue resolution — no issues or no data
38.2/38.3PR acceptance — 2/2 decided PRs merged
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Inputs used
merged_prs2
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.
How it's scored
30/30Ownership backing — organization-owned
0/20Verified domain
4.3/25Owner reach — 3 followers of oinam
25/25Track record — 99 public repos, account ~15 yr old
Inputs used
followers3
owner_typeOrganization
is_verified
owner_loginoinam
public_repos99
account_age_days5,818
How it's scored
25/25Published & resolvable — 1 package(s) on npm
35/35Publish recency — latest publish 5 days ago
20/20Version history — 29 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packagesovellum
ecosystemsnpm
any_deprecatedno
min_days_since_publish5

Engineering Quality

Are baseline engineering and documentation practices in place?

93Excellent · 20% of overall
How it's scored
24/24CI workflows — 5 workflow(s)
24/24Tests present
16/16Linter config — eslint.config.js
0/9.6Pre-commit hooks
6.4/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — no data
Inputs used
has_ciyes
has_testsyes
has_editorconfigyes
has_linter_configyes
has_precommit_configno
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.

Documentation

100Excellent
How it's scored
30/30README
25/25Documentation directory
15/15Documentation / homepage site — https://ovellum.oss.oinam.com
10/10Repository description
10/10Topics — 2 topics
10/10Wiki
Inputs used
topicsdocumentation, documentation-tool
has_wikiyes
homepagehttps://ovellum.oss.oinam.com
has_readmeyes
has_docs_diryes
has_descriptionyes

Security

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

27Critical · 16% of overall
How it's scored
7.5/7.5Binary-Artifacts — no binaries found in the repo
2.2/7.5Branch-Protection — branch protection is not maximal on development and all release branches
0/2.5CI-Tests — no data
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
2.5/2.5Contributors — project has 3 contributing companies or organizations -- score normalized to 10
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/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
0/5Packaging — no data
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — no SAST tool detected
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — no data
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 12 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated15
scorecard_versionv5.5.0
checks_inconclusive3
scorecard_aggregate2.8
Excluded from scoring (no data or not applicable): ci_tests, packaging, signed_releases. Remaining weights renormalized.

AI Readiness

How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score.

71Good · 0% of overall
How it's scored
45/45Agent instructions — CLAUDE.md
0/15Machine-readable docs (llms.txt)
40/40Legible commit history — 100 of 100 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share1
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes3,592
How it's scored
0/18One-command bootstrap
22/22Automated tests
11/11Lint / format config — eslint.config.js
11/11Static type checking — packages/cli/tsconfig.json, packages/core/tsconfig.json, packages/generator/tsconfig.json, packages/merger/tsconfig.json, packages/parser/tsconfig.json, packages/reader/tsconfig.json, packages/site/tsconfig.json, tsconfig.json
10/10Reproducible environment — lockfile
0/10Demonstrated agent practice — no agent-authored commits among the last 100
0/8Automated maintenance — no automated dependency updates observed
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Inputs used
has_nixno
has_testsyes
lockfilespnpm-lock.yaml
has_dockerfileno
typed_languageyes
bootstrap_files
has_devcontainerno
has_linter_configyes
typecheck_configspackages/cli/tsconfig.json, packages/core/tsconfig.json, packages/generator/tsconfig.json, packages/merger/tsconfig.json, packages/parser/tsconfig.json, packages/reader/tsconfig.json, packages/site/tsconfig.json, tsconfig.json
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0
How it's scored
45/45Type-checkable code — TypeScript (statically typed)
54.3/55Manageable file sizes — 2/160 source files over 60KB
Inputs used
primary_languageTypeScript
largest_source_bytes72,143
source_files_sampled160
oversized_source_files2
How it's scored
0/40API schema (OpenAPI/GraphQL/proto)
20/20MCP server
40/40Runnable examples — examples
Inputs used
example_dirsexamples
has_mcp_signalyes
api_schema_files

Key facts

1GitHub stars
1contributors
312commits, last 12 months
5days since last push
27releases
1bus factor
0open issues
npmpackage ecosystems

Data collection warnings

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

More detail

OpenSSF Scorecard 2.8 / 10
2.8aggregate

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-24 00:15 UTC

10Binary-Artifactsno binaries found in the repo
3Branch-Protectionbranch protection is not maximal on development and all release branches
n/aCI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
10Contributorsproject has 3 contributing companies or organizations -- score normalized to 10
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
n/aPackagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
n/aSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities12 existing vulnerabilities detected
Direct dependencies 43
RegistryPackageVersion constraintManifest
npm@inquirer/prompts^8.4.3packages/cli/package.json
npmc123.3.4packages/cli/package.json
npmchokidar^5.0.0packages/cli/package.json
npmcitty^0.2.2packages/cli/package.json
npmgray-matter^4.0.3packages/cli/package.json
npmlucide^1.16.0packages/cli/package.json
npmpagefind^1.5.2packages/cli/package.json
npmrehype-autolink-headings^7.1.0packages/cli/package.json
npmrehype-raw^7.0.0packages/cli/package.json
npmrehype-sanitize^6.0.0packages/cli/package.json
npmrehype-slug^6.0.0packages/cli/package.json
npmrehype-stringify^10.0.1packages/cli/package.json
npmremark-parse^11.0.0packages/cli/package.json
npmremark-rehype^11.1.2packages/cli/package.json
npmshiki^4.0.2packages/cli/package.json
npmts-morph^28.0.0packages/cli/package.json
npmunified^11.0.5packages/cli/package.json
npmunist-util-visit^5.1.0packages/cli/package.json
npmc123.3.4packages/core/package.json
npm@ovellum/coreworkspace:*packages/generator/package.json
npm@ovellum/coreworkspace:*packages/merger/package.json
npm@ovellum/readerworkspace:*packages/merger/package.json
npm@ovellum/coreworkspace:*packages/parser/package.json
npmts-morph^28.0.0packages/parser/package.json
npm@ovellum/coreworkspace:*packages/reader/package.json
npmgray-matter^4.0.3packages/reader/package.json
npm@ovellum/coreworkspace:*packages/site/package.json
npm@ovellum/readerworkspace:*packages/site/package.json
npmgray-matter^4.0.3packages/site/package.json
npmlucide^1.16.0packages/site/package.json
npmpagefind^1.5.2packages/site/package.json
npmrehype-autolink-headings^7.1.0packages/site/package.json
npmrehype-raw^7.0.0packages/site/package.json
npmrehype-sanitize^6.0.0packages/site/package.json
npmrehype-slug^6.0.0packages/site/package.json
npmrehype-stringify^10.0.1packages/site/package.json
npmremark-directive^4.0.0packages/site/package.json
npmremark-gfm^4.0.0packages/site/package.json
npmremark-parse^11.0.0packages/site/package.json
npmremark-rehype^11.1.2packages/site/package.json
npmshiki^4.0.2packages/site/package.json
npmunified^11.0.5packages/site/package.json
npmunist-util-visit^5.1.0packages/site/package.json
All dependencies not collected

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

Raw JSON report machine-readable
{
  "data": {
    "repo": {
      "topics": [
        "documentation",
        "documentation-tool"
      ],
      "is_fork": false,
      "size_kb": 4038,
      "has_wiki": true,
      "homepage": "https://ovellum.oss.oinam.com",
      "languages": {
        "CSS": 98947,
        "Shell": 8962,
        "JavaScript": 35226,
        "TypeScript": 960422
      },
      "pushed_at": "2026-07-18T15:58:52Z",
      "created_at": "2026-05-13T03:47:08Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-18T15:58:55Z",
      "description": "Write what matters, generate the rest - open source documentation where both live together.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript"
      ]
    },
    "owner": {
      "blog": "https://oinam.com",
      "name": "Oinam",
      "type": "Organization",
      "login": "oinam",
      "company": null,
      "location": "Internet",
      "followers": 3,
      "avatar_url": "https://avatars.githubusercontent.com/u/368471?v=4",
      "created_at": "2010-08-18T13:43:27Z",
      "is_verified": null,
      "public_repos": 99,
      "account_age_days": 5818
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "ovellum@0.25.0",
          "kind": "other",
          "published_at": "2026-07-18T15:51:21Z"
        },
        {
          "tag": "ovellum@0.24.0",
          "kind": "other",
          "published_at": "2026-07-13T03:23:26Z"
        },
        {
          "tag": "ovellum@0.23.0",
          "kind": "other",
          "published_at": "2026-07-09T13:42:22Z"
        },
        {
          "tag": "ovellum@0.22.0",
          "kind": "other",
          "published_at": "2026-07-04T17:03:56Z"
        },
        {
          "tag": "ovellum@0.21.0",
          "kind": "other",
          "published_at": "2026-06-30T08:15:45Z"
        },
        {
          "tag": "ovellum@0.20.0",
          "kind": "other",
          "published_at": "2026-06-29T15:43:13Z"
        },
        {
          "tag": "ovellum@0.19.0",
          "kind": "other",
          "published_at": "2026-06-27T10:29:45Z"
        },
        {
          "tag": "ovellum@0.18.0",
          "kind": "other",
          "published_at": "2026-06-26T12:41:49Z"
        },
        {
          "tag": "ovellum@0.17.0",
          "kind": "other",
          "published_at": "2026-06-26T11:09:27Z"
        },
        {
          "tag": "ovellum@0.16.0",
          "kind": "other",
          "published_at": "2026-06-26T06:30:47Z"
        },
        {
          "tag": "ovellum@0.15.0",
          "kind": "other",
          "published_at": "2026-06-25T19:59:53Z"
        },
        {
          "tag": "ovellum@0.14.0",
          "kind": "other",
          "published_at": "2026-06-25T15:50:41Z"
        },
        {
          "tag": "ovellum@0.13.0",
          "kind": "other",
          "published_at": "2026-06-25T01:49:41Z"
        },
        {
          "tag": "ovellum@0.12.0",
          "kind": "other",
          "published_at": "2026-06-14T15:40:25Z"
        },
        {
          "tag": "ovellum@0.11.0",
          "kind": "other",
          "published_at": "2026-06-14T13:31:11Z"
        },
        {
          "tag": "ovellum@0.10.1",
          "kind": "other",
          "published_at": "2026-06-14T12:16:34Z"
        },
        {
          "tag": "ovellum@0.10.0",
          "kind": "other",
          "published_at": "2026-06-14T10:11:06Z"
        },
        {
          "tag": "ovellum@0.9.0",
          "kind": "other",
          "published_at": "2026-06-14T08:41:23Z"
        },
        {
          "tag": "ovellum@0.8.0",
          "kind": "other",
          "published_at": "2026-06-14T07:53:02Z"
        },
        {
          "tag": "ovellum@0.7.0",
          "kind": "other",
          "published_at": "2026-06-14T05:49:46Z"
        },
        {
          "tag": "ovellum@0.6.0",
          "kind": "other",
          "published_at": "2026-06-13T16:41:02Z"
        },
        {
          "tag": "ovellum@0.5.1",
          "kind": "other",
          "published_at": "2026-06-13T15:18:19Z"
        },
        {
          "tag": "ovellum@0.5.0",
          "kind": "other",
          "published_at": "2026-06-13T14:31:32Z"
        },
        {
          "tag": "ovellum@0.4.0",
          "kind": "other",
          "published_at": "2026-06-13T11:24:42Z"
        },
        {
          "tag": "ovellum@0.3.0",
          "kind": "other",
          "published_at": "2026-06-08T02:46:32Z"
        },
        {
          "tag": "ovellum@0.2.2",
          "kind": "other",
          "published_at": "2026-05-31T08:13:05Z"
        },
        {
          "tag": "ovellum@0.2.1",
          "kind": "other",
          "published_at": "2026-05-30T17:49:36Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "630417b310ab021a9ee0c530194cb79d839e58b6",
          "body": null,
          "is_bot": false,
          "headline": "docs(internal): mark 0.25.0 live + note MCP registry blocker",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-07-18T15:58:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a17b6ee50478ac6c9832a262b33badbf908b75be",
          "body": null,
          "is_bot": false,
          "headline": "chore: release 0.25.0",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-07-18T13:05:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f0526d478e100a70461beb4428981abd556de1bc",
          "body": "Three related slices around documentation \"Edited\" dates and the per-page\naction row.\n\nGenerated docs now respect the source's edited date. The generator baked\nbuild-time timestamps into every file (frontmatter `generated:` + an anchor\n`generated=` attribute), so regeneration churned the file each b\n[…]\ni (filled brand marks via renderBrandIcon). Copy flashes a\ncheck on success. Gemini's deep-link is best-effort — see TODO.\n\nDocs (en+ja) + FEATURES updated; three changesets (ovellum minor -> 0.25.0).",
          "is_bot": false,
          "headline": "feat(docs): respect edited dates and refresh per-page actions",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-07-18T12:57:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "185513309ea38ce9b1088756e4677abec31725ff",
          "body": null,
          "is_bot": false,
          "headline": "docs(internal): mark 0.24.0 live + sweep handoff state",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-07-13T03:27:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ff52f3756eb76a773e79fcfe864a1c03107497ae",
          "body": null,
          "is_bot": false,
          "headline": "chore: release 0.24.0",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-07-13T03:21:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dcd3b787cf0c450515541823e3fa7645b794b83e",
          "body": "mailto:hi@oinam.com after the npm icon, localized label (en/ja). No\nexternal flag — mailto links shouldn't get target=\"_blank\".",
          "is_bot": false,
          "headline": "feat(website): add Contact mail icon to the topbar",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-07-13T03:20:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d1226195d9fe67a198ff903fed73997845fadae5",
          "body": "Drop the editorial page frame — the fixed vertical rules and the \"+\"\ncorner marks at the header baseline and footer top border. Header keeps\nonly its hairline border-bottom, footer its border-top. One --page-inset\ntoken replaces --frame-inset/--frame-gutter; the doc layout pads\nsymmetrically so the \n[…]\na translucent foreground tint (dark-mode safe). Hide\nthe shortcut chip while the input holds a query so it never sits under\nClear. Define the missing --radius-sm token (referenced 10x, never\nshipped).",
          "is_bot": false,
          "headline": "feat(site): simplify default theme chrome and finish theming search",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-07-13T03:19:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b60716c879d19a5410ff39c178b96c4cdd305c80",
          "body": null,
          "is_bot": false,
          "headline": "docs(internal): mark 0.23.0 live + sweep handoff state",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-07-09T13:45:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ef38788cac722760c7c026cd03ad086af6e9739c",
          "body": null,
          "is_bot": false,
          "headline": "chore: release 0.23.0",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-07-09T12:47:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "00465266882b4b436172c933004dd82e976d7451",
          "body": "…lback + check validation",
          "is_bot": false,
          "headline": "feat(site,cli): reusable snippets — ::include directive with i18n fal…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-07-09T12:45:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1fed648e806f601f3c8a3f838f8a2c70cb8d4e1b",
          "body": null,
          "is_bot": false,
          "headline": "docs(internal): mark 0.22.0 live + sweep handoff state",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-07-04T17:05:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1db532a18292fb4659556d15af51779badad6d4c",
          "body": null,
          "is_bot": false,
          "headline": "chore: release 0.22.0",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-07-04T17:01:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "27a2eb8e35105abdc22810af9c9a81ac5f3bc30b",
          "body": "…nding OG cards",
          "is_bot": false,
          "headline": "feat(site): images slice 3 — maxWidth resize cap, AVIF conversion, la…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-07-04T16:59:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d25788498e698138fb66954bab37f12b8bb053d7",
          "body": "…temap exclusion, ovellum snapshot",
          "is_bot": false,
          "headline": "feat(site,cli): versioning polish — old-version banner + noindex + si…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-07-04T16:49:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c9af0e7975a73fedaa50d82ce14af9b72d44c567",
          "body": "…ult robots.txt",
          "is_bot": false,
          "headline": "feat(site): AI discoverability — text/markdown alternate links + defa…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-07-04T16:38:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6deb4b1ba2ac43a172f56a2328a111dd79b8c5e6",
          "body": "… verbose fallback note",
          "is_bot": false,
          "headline": "fix: orphan filename collision suffix, dev-server stat race, notifier…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-07-04T16:33:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d41ddbcd5c0e024475eadfd9c26d5e5afd47f2cf",
          "body": "…n, re-plan toward v1.0.0",
          "is_bot": false,
          "headline": "docs(internal): roadmap second edition — archive cleared first editio…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-07-03T16:01:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "70a23b714bac750658bbd55c1c17ab572a621728",
          "body": "…S.md/CLAUDE.md",
          "is_bot": false,
          "headline": "feat(cli): ovellum agents — canonical \"Ovellum docs\" section in AGENT…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-07-02T14:37:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ec57dd0b85903111928df43c25740674ec2bdf89",
          "body": null,
          "is_bot": false,
          "headline": "docs(internal): competitive analysis of OpenWiki (langchain-ai)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-07-02T14:37:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5b6e1ff76e4afaa8d59d140e83a84302591f74a4",
          "body": "cli.md (en): drop the stale '## Planned subcommands' heading and promote\n'ovellum clean' to a proper '## ovellum clean' section — clean shipped in 0.21.0.\ncli.md (ja): promote the mis-nested 'ovellum clean' to '## ovellum clean'.\nthemes.md (en+ja): remove the delivered 'site.theme' roadmap bullet — named\npage-wide palette switching (Nord, etc.) ships today as site.palette. ja\nre-stamped; check 0/0/0, 58 pages.",
          "is_bot": false,
          "headline": "docs(site): fix post-0.21.0 doc drift",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-30T08:26:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d7a4c83a2b05747cd880b160646ded984eea2192",
          "body": "CLAUDE.md version → 0.21.0; TODO.md Current state updated with the B9 image\nfeatures (site.images/format/ogImage), site.minify, ovellum clean, and the\nrelease-gotcha note (mid-publish OTP expiry from cold-cache prepublishOnly).",
          "is_bot": false,
          "headline": "docs(internal): mark 0.21.0 live + sweep handoff state",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-30T08:18:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ad535a63094c60fb7ca5f8c455b0f49d2e781aa7",
          "body": "WebP conversion (site.images.format), OpenGraph cards (site.ogImage), CSS/JS\nminification (site.minify), ovellum clean, and image optimization (site.images)\n— five minor changesets. Version sources bumped (cli package.json via changeset\nversion, site.version badge, server.json x2) and CHANGELOG written.",
          "is_bot": false,
          "headline": "chore: release 0.21.0",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-30T08:07:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "678b141098d5296d7a6fe85fb182a065a2ea6853",
          "body": "Two opt-in image features, both reusing the lazy-sharp optional-peer pattern.\n\nWebP conversion (site.images.format: 'webp'): converts .png/.jpg/.jpeg to a\nsibling .webp and rewrites the matching Markdown <img src> to it via a post-\nsanitize rehypeWebpImages pass (by-extension; skips schemes/data:/no\n[…]\nsets \"Converting to WebP\" + \"Social share images\" + config ref (en+ja). Tests:\nvalidate (2) + markdown rewrite (2) + og-image unit (3, real 1200x630 PNG) +\ncli-smoke (3, compiled CLI). Two changesets.",
          "is_bot": false,
          "headline": "feat(site): B9 slice 2 — WebP conversion + OpenGraph cards",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-30T08:03:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a78d500406915a036031cc3342af4841515c21ba",
          "body": "CI lint (@typescript-eslint/no-unused-expressions) flagged run-build.ts:99,\nan expression-statement ternary introduced in B8. No behavior change. Local\ngate now mirrors CI (lint + typecheck + test + build + frozen-lockfile): all\ngreen, 495 tests.",
          "is_bot": false,
          "headline": "fix(cli): lint — countWarnings ternary-as-statement → if/else",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-30T07:30:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "44da6b9811d936563e068b5af811a166f67d1135",
          "body": "A new `ovellum clean` command (commands/clean.ts, registered in index.ts).\nDry-run by default — lists what it would remove; --confirm deletes.\n\n  manual mode  → removes the whole output dir (100% generated from input)\n  auto/hybrid  → removes generated .md (ovellum: true frontmatter), but NEVER a\n  \n[…]\nommand table flipped to \"available\" (en+ja);\nCLAUDE.md command list updated. Tests: cli-smoke (2 — hybrid preserve-matrix +\nmanual whole-dir/--orphans) + real-CLI smoke. FEATURES/ROADMAP/TODO updated.",
          "is_bot": false,
          "headline": "feat(cli): ovellum clean — safe removal of generated output",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-30T07:16:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c33dfc3569d441c9179408bbaae3a4789f70785f",
          "body": "Opt-in site.minify: boolean minifies author-supplied .css/.js during the build\nvia lazily-imported esbuild. Scope is narrow by design: the bundled theme is\nalready minified and esbuild can't do HTML, so this touches only content-folder\npassthrough .css/.js (via copyAsset) and a templateDir's user st\n[…]\noolean). Docs: assets guide\n\"Minifying CSS and JS\" + config reference (en+ja). Tests: validate (1) + minify\n(2) + cli-smoke integration (1). HTML-page minification deferred (needs a\nnon-esbuild tool).",
          "is_bot": false,
          "headline": "feat(site): CSS/JS minification — site.minify, lazy esbuild",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-30T07:04:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "87911ae8db42d498b61c35c1ef88551b0700b2d3",
          "body": "A framing section up top: the two alternatives' failure modes (pure generator\n→ hand edits lost / prose-in-separate-files drift; hand-written-only → silently\nstale), then a \"when the source changes\" table (change signature / rename-delete\n/ add symbol × generator / hand-written / hybrid) whose last \n[…]\n\n\"never fall out of sync\" payoff. Cross-links the migration guide rather than\nduplicating its TypeDoc comparison. en+ja 1:1; ROADMAP U7 done (U-series\nU1–U8 all complete). Website-only (no changeset).",
          "is_bot": false,
          "headline": "docs(site): \"Why hybrid\" comparison in the hybrid guide (U7)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-30T06:27:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dc924e383338e61487610299e8104e0e8fcc0f9a",
          "body": "U1 — guides/troubleshooting: protected zones not merging (id-less positional\nwarning + --strict positional-zone/stale-anchor), unbalanced @manual tags, the\n\"prose disappeared → orphans\" recovery walkthrough (ovellum orphans\n[--stale|--reattach], present/gone/unknown status), config not loading (miss\n[…]\n guides nav; ROADMAP U1/U2 marked done. Every\ncross-link anchor (incl. hand-written Japanese slugs) verified to resolve;\nwebsite builds 58 pages / 0 warnings, check 0/0/0. Website-only (no changeset).",
          "is_bot": false,
          "headline": "docs(site): troubleshooting + migration guides (U1, U2)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-30T06:20:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2ed6e95931ca711da2db47820f689610a4355662",
          "body": "Slice 2 is two independent M-features (webp format conversion via a new\nimg-rewrite rehype pass; net-new OG-image generation). Maintainer deferred to\nbacklog after the design pass; captured the approach so it isn't lost.",
          "is_bot": false,
          "headline": "docs(internal): record B9 slice-2 design + defer to backlog",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-30T06:03:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0c27b2b080d01ff02d46c191a85ce506f5085b0a",
          "body": "Opt-in raster re-compression: site.images: { quality? } re-encodes\n.jpg/.jpeg/.png/.webp/.avif assets in place (same path + format, smaller bytes,\nno <img src> rewriting) via sharp. packages/site/src/images.ts: lossy quality\n(default 80) for jpeg/webp/avif, lossless max-deflate for png; keeps the\nor\n[…]\ne) + validation (quality 1-100 int). Docs: assets guide\n+ config reference (en+ja). Tests: validate (1) + site images (2) + cli-smoke\nintegration (1). Slice 2 (format conversion + OG images) deferred.",
          "is_bot": false,
          "headline": "feat(site): image optimization — site.images, lazy sharp (B9 slice 1)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-30T05:47:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f5708e9d00e1cd65e63596248211756b185c0e44",
          "body": "Update TODO 'Current state' to 0.20.0 (theme inheritance B10, build-output\nseverity B8, the complete plugin/extension API B1 + D3) and the version fact\nin CLAUDE.md. 0.20.0 is live on npm; tree was clean and pushed.",
          "is_bot": false,
          "headline": "docs(internal): sweep handoff state for 0.20.0 (published)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-29T15:47:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8d64730c1cfc8a2ba5e788f445b8a42662b9fa4b",
          "body": "ovellum 0.19.0 → 0.20.0. Consumes 7 changesets: theme inheritance (site.css,\nsite.appearance, palette: 'bare'), build-output severity levels, and the\nplugin/extension API (lifecycle hooks / D3, markdown plugins, site.templateDir).\nBumps packages/cli/package.json + CHANGELOG, site.version badge, and server.json\n(MCP registry manifest).",
          "is_bot": false,
          "headline": "chore: version packages",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-29T15:32:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "60f664eb71e38aaa21bbc98d8577710bea3f5f4f",
          "body": "… (B1 slice 3)\n\nsite.templateDir points at a directory whose assets replace the bundled theme's,\nper file with fallback: style.css → /assets/ovellum.css, script.js →\n/assets/ovellum.js, fonts/ → /assets/fonts/. Provide only some and the rest fall\nback to the default (writeStaticAssets pick()), so yo\n[…]\ndown\nplugins (slice 2), template overrides (slice 3). Validation (1) + api e2e (1);\ndocs themes \"Bring your own template directory\" + config reference (en+ja);\nPLUGINS.md / ROADMAP / FEATURES updated.",
          "is_bot": false,
          "headline": "feat(site,core): bring your own template directory — site.templateDir…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-29T15:28:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "afaafe1f53a9cf08eed8149f7e025c7d3a2dc309",
          "body": "A plugin can extend the Markdown pipeline with remarkPlugins / rehypePlugins\n(each a unified Pluggable). remark plugins inject after Ovellum's built-ins and\nbefore the HTML conversion; rehype plugins inject BEFORE rehypeSanitize, so\nsanitize stays the security guard over everything they produce — a\n\n[…]\nwn, not HTML).\n\nDocs: plugins guide \"Markdown plugins\" + security note (en+ja). Tests: validate\n(1) + markdown (3, incl. the <script>-stripped pin) + api e2e (1). Slice 3\n(template overrides) remains.",
          "is_bot": false,
          "headline": "feat(site,core): plugin markdown plugins — remark/rehype (B1 slice 2)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-29T14:58:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d65161bbf152f06fa625a9c4231903ccf3e1b485",
          "body": "… slice 1, D3)\n\nconfig.plugins: OvellumPlugin[] extends the build with named units of\nlifecycle hooks (the Vite/Rollup model), run in array order:\n\n  onResolveConfig(config) → config|void   replace config (CLI overrides still win)\n  onBuildStart({config,cwd,mode})          before any output\n  transf\n[…]\n\nSlice 2 (remark/rehype) and slice 3 (template overrides) remain.\n\nDocs: plugins guide + config reference (en+ja). Tests: validate (1) + api\nlifecycle (3); proven e2e through a real ovellum.config.ts.",
          "is_bot": false,
          "headline": "feat(cli,core,site): plugin/extension API — build lifecycle hooks (B1…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-29T14:07:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c681e53a472016cc9bcc043238c1524a591e5bf1",
          "body": "Build diagnostics now carry a severity. New BuildWarning {message, severity:\n'info'|'warning'} in @ovellum/core (exported from the ovellum package);\nBuildSiteResult.warnings and BuildSummary.warnings are BuildWarning[].\n\n'warning' = a real problem to act on (orphaned block, asset skipped for\nsafety,\n[…]\nad of bare strings — branch\non severity === 'warning' to gate CI. check's own issue list is unchanged.\n\nDocs: automation + cli reference (en+ja). build-warnings.test.ts (4) +\ncli-smoke + rename-build.",
          "is_bot": false,
          "headline": "feat(cli,site): build-output severity levels — info vs warning (B8)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-29T13:42:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "db6d510f8325d325db0df8bed4c81467556e7900",
          "body": null,
          "is_bot": false,
          "headline": "docs(internal): mark B10 theme inheritance complete (B10.1+B10.2+B10.3)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-29T13:28:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2c2ae057e724042a6e00442aa0119eb5e8a285b6",
          "body": "…(B10.3)\n\nsite.palette: 'bare' ships no baked palette. renderBareThemeHead injects a\n[data-palette=\"bare\"] <style> that maps each color + --font-body token to\nvar(--ov-host-NAME, <Ovellum default>), with mode-aware light/dark/auto blocks\nso \"define none → default look\" holds in both modes. A host st\n[…]\nheritance (B10.1 site.css + B10.2 site.appearance +\nB10.3 palette: 'bare'). Core OvellumPalette/PALETTES widened; themes guide\n\"Bare mode\" + config reference, en+ja; template (2) + validate (1) tests.",
          "is_bot": false,
          "headline": "feat(site): token-only \"bare\" palette — host as sole source of color …",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-29T12:24:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "04708a1468340e76a88a61cf9d232b708ab35b2d",
          "body": "…rance host light/dark (B10.1, B10.2)\n\nMake Ovellum docs adopt a host project's design when embedded under it.\n\nB10.1 — site.css (string | string[]): author stylesheet URL(s) linked into\n<head> AFTER the base theme CSS so :root token re-declarations win the\ncascade. The supported hook for overriding\n[…]\nboot-script branch; script.js\ninherit-follow. Themes guide \"Inheriting a host project's design\" +\n\"Following the host's light/dark switch\" + config reference, en+ja.\ntemplate (3) + validate (2) tests.",
          "is_bot": false,
          "headline": "feat(site): theme inheritance — site.css token overrides + site.appea…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-29T11:48:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6f8ba80b0a8a8da84a703aa8b8a08fb912eabeec",
          "body": null,
          "is_bot": false,
          "headline": "docs(internal): sweep handoff state for 0.19.0 (published)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-27T10:33:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1c7b7089989bc8f84ca5445cea829c833a7bc434",
          "body": null,
          "is_bot": false,
          "headline": "chore: version packages",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-27T10:25:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "21847d3e598e4ebe3035e98a46dad47e5765c12d",
          "body": "…opbar picker (B6)\n\nPublish multiple versions side by side. `site.versions: [{ id, label?, latest? }]`\nmaps each id to a `content/<id>/` subtree; the `latest` (or first) serves at the\nroot, the rest under `/<id>/`. A topbar version picker switches between them,\nkeeping the reader on the same page wh\n[…]\n e2e (v2 at root, v1 under /v1/,\n  cross-version page mapping). Changeset (minor).\n\nDeferred to a slice 2: old-version noindex/sitemap exclusion, an \"old version\"\nbanner, a `version snapshot` command.",
          "is_bot": false,
          "headline": "feat(site): versioned docs — site.versions, directory-per-version + t…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-27T10:15:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2ade2dc8a598d15f2436d76771602a63d65122ba",
          "body": "…blocks (B5)\n\n`site.landing.sections: OvellumLandingSection[]` (union: hero | install |\nfeatures | trust | scene | prose | custom-html) takes over the fixed\nhero→install→features→prose→trust order — arrange/repeat blocks and inject\nfree-form prose or raw HTML anywhere.\n\n- core: OvellumLandingSection\n[…]\ndoubles as shorthand. Inline prose/custom-html isn't localized (flat blocks\n  are). Docs en+ja (config reference + composable-sections section).\n- Tests: landing (4) + validate (1). Changeset (minor).",
          "is_bot": false,
          "headline": "feat(site): composable landing — site.landing.sections ordered typed …",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-27T09:57:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ec8832ede21cf2b950ccfab1901fc54e3d028393",
          "body": "…o?, source?, label? } object (B4)\n\nBring your own self-hosted typeface to the default template with no headExtra\nhacking. Alongside the 'sans'|'serif'|'inter'|'geist' keywords, site.font now\ntakes an object:\n\n- core: OvellumCustomFont type + validation (body required; family values reject\n  `< > { \n[…]\nfamily.\n- FOUT is the author's @font-face `font-display` call (STYLES.md §1.3).\n- init annotated config + themes/config docs rewritten (en+ja).\n- Tests: template (2) + validate (1). Changeset (minor).",
          "is_bot": false,
          "headline": "feat(site): custom fonts via config — site.font accepts a { body, mon…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-27T09:46:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ccd3afa967f7da4e194377033152d570838acc4b",
          "body": "On an i18n site each locale now gets its own feed — /feed.xml for the default\nlanguage, /<code>/feed.xml for the rest — scoped to that locale's pages, with\nthe channel <link> and atom self-link prefixed. The sitemap stays one combined\nfile; single-language output is byte-identical.\n\n- rss.ts: `local\n[…]\n (9).\n\nAlso resolves B3 (ROADMAP): `extractMarkdownLinks` is no longer dead code\n(`check` uses it); build-time link warnings deliberately not added (build/check\nseparation). Changeset (minor) for RSS.",
          "is_bot": false,
          "headline": "feat(site): per-locale RSS feeds (closes the last i18n gap)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-27T08:45:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a048674d6460d6b7cbbbaf77f31fb2ba1412fe6f",
          "body": "…ick wins (U6)\n\nU5 — better small messages:\n- `ovellum dev --verbose` logs each request (METHOD path → status;\n  DevServerOptions.logRequests, skips SSE/reload internals).\n- `upgrade` registry-failure now hints `npm install -D ovellum@latest`.\n- `dev` manual-only error points at watch/build (dropped\n[…]\nanding mode-explainer — redundant with the Three Modes card + hero.)\n\ncli.md documents `dev --verbose` (en+ja). Changeset (minor) for the U5 CLI bits;\nU6 is docs-only. 149 cli tests; link check clean.",
          "is_bot": false,
          "headline": "feat(cli): clearer messages + dev --verbose request log (U5); docs qu…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-27T08:37:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d8f9981b1480cd37a14b77024e7c0396a02a66d2",
          "body": "…(U3)\n\nThe hybrid starter index.md now leads with a `@manual id=\"welcome-note\"` zone\n(\"Add your own notes here — this block survives every rebuild\"), so new hybrid\nprojects meet the merge contract on day one. Manual mode is unchanged.\n`renderStarterIndex` exported + pinned by init-render.test.ts (2). Dev guide\nnotes the hybrid example (en+ja; the --yes fast path was already documented).\nChangeset (patch).",
          "is_bot": false,
          "headline": "feat(init): scaffold a @manual protected-zone example in hybrid mode …",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-27T08:26:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ea4e22017388c216487840f19e894ec97340fe54",
          "body": "The published cli bundles @ovellum/* source via tsup `noExternal`, but the root\n`build` task had no `inputs` — so turbo only hashed the cli's own files plus\ndependency `.d.ts` outputs. Template (CSS/JS) edits and signature-stable site\n`src` edits left those outputs unchanged, so the cli build cache-\n[…]\nte-copy script invalidates the cli build. Verified: touching style.css\nnow cache-misses `ovellum:build`; an unchanged build stays FULL TURBO. Repo-only\ntooling (not in the npm package) — no changeset.",
          "is_bot": false,
          "headline": "build(turbo): track bundled @ovellum/* source in the cli build cache",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-27T08:17:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "79f313be8ebeb5611b8b2a627501fbdc6c154d65",
          "body": null,
          "is_bot": false,
          "headline": "docs(internal): sweep handoff state for 0.18.0 (published)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-26T12:44:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "223f2a108565897273d4a9cc7e34096b5ecf083d",
          "body": null,
          "is_bot": false,
          "headline": "chore: version packages",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-26T12:35:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d16c7b864a5c968b95045961df43e4c375f332ae",
          "body": "Mermaid:\n- ```mermaid fences → <pre class=\"mermaid\"> (rehypeMermaid). Runtime lazy-loaded\n  client-side, ONLY on pages with a diagram (script.js reads <html\n  data-ov-mermaid>), from a pinned jsDelivr build by default. No-JS/offline keeps\n  the readable source as fallback.\n- Config site.mermaid: { e\n[…]\nents guide (Mermaid section) + config (site.mermaid) + automation\n(per-page actions) + live examples in the styleguide (en+ja). 195 site tests.\nCOMPETITIVE adopt items #2 + #4 done. Changeset (minor).",
          "is_bot": false,
          "headline": "feat: Mermaid diagrams + per-page \"use with an LLM\" actions",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-26T12:33:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0f48fa3b126ed5b802e7a14fde4072137a07f3a7",
          "body": "- :::code-group wraps fenced code blocks into a tabbed switcher; each tab is\n  labeled by the fence's language or a `title=\"…\"` on the info string. Reuses\n  the .ov-tabs / rehypeTabs path (shiki highlights after the upgrade); a single\n  `:::` since its children are fences, not directives. (directive\n[…]\nrified .mdx end-to-end via a build. Changeset (minor).\n\nAlso noted a dev gotcha in TODO.md: the CLI bundles @ovellum/site source, so\n`turbo --force` is needed after site edits (turbo cache misses it).",
          "is_bot": false,
          "headline": "feat: B2.2 — :::code-group (tabbed code) + .mdx files as Markdown",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-26T12:04:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c76eaa2db54ee0f3518c2a692503095be3994c28",
          "body": "…h + text-wrap: balance)",
          "is_bot": false,
          "headline": "fix(site): widen landing hero title to two balanced lines (16ch → 30c…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-26T11:54:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "79759402cc115db4a4cd36a3223f6e16ef6635e4",
          "body": "…tabs (B2)\n\nAuthor rich content blocks with `:::` directive syntax (remark-directive), no\nJSX/MDX — output stays portable Markdown.\n\n- packages/site/src/directives.ts: `remarkComponents` (remark phase) maps\n  :::note|tip|important|warning|caution / :::steps+:::step / :::cards+:::card /\n  :::tabs+:::\n[…]\nocs: guides/components (en+ja) + live examples in the styleguide. FEATURES +\nROADMAP (B2 slice 1 done; B2.2 = code-group + .mdx files deferred). 193 site\ntests (+5 directive cases). Changeset (minor).",
          "is_bot": false,
          "headline": "feat: Markdown-native component directives — callouts, steps, cards, …",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-26T11:48:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3949ccd1b8ed6fa4d9b0bbb12d1b4e74c0965783",
          "body": "- Add docs/internal/COMPETITIVE.md — study of the leading commercial docs\n  platform: our edge (hybrid merge, write_zone moat, portability, free/OSS,\n  i18n), what to adopt (component directives/B2, mermaid, copy-for-LLM,\n  versioning/B6, migration/U2), what to skip (the SaaS surface), and the futur\n[…]\n named.\n- ROADMAP pointer + CLAUDE.md keepers updated (add COMPETITIVE.md; TODO-Human.md\n  reference repointed to repo-root TODO.md).\n- TODO.md publish-state → 0.17.0 live + MCP Registry shows 0.17.0.",
          "is_bot": false,
          "headline": "docs(internal): competitive analysis + 0.17.0 publish-state sweep",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-26T11:24:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9ce43a7dfd96e3aa34dde8d61b40dbbf1393764c",
          "body": "…-login flag; fix --help",
          "is_bot": false,
          "headline": "build(publish.sh): auto re-login to MCP Registry on expired token + -…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-26T11:16:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8a3395bc2eb3ba6564a635d663f86a3ab10ffa93",
          "body": null,
          "is_bot": false,
          "headline": "chore: version packages",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-26T11:07:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cda4f13851b1be2991bc1fd889af35f8201a6ddd",
          "body": "- Move the human task list to root TODO.md (maintainer reorg); delete\n  docs/internal/TODO-Human.md.\n- Repoint all references: public Contributing links (en+ja) + internal\n  clickable links (RELEASE/TODO/FEATURES) → root TODO.md (no dangling paths).\n- README trimmed to essentials with the finalized tagline.",
          "is_bot": false,
          "headline": "docs: relocate TODO-Human.md → root TODO.md; finalize minimal README",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-26T11:05:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f7620ffde7e93c25bad702b2de7ee871fe471b7e",
          "body": null,
          "is_bot": false,
          "headline": "build: add publish.sh release script + document it in RELEASE.md",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-26T10:56:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "50c327cbd09d9e5fe1d82d220963037aa6e4e783",
          "body": "… out of sync' (from README)",
          "is_bot": false,
          "headline": "docs: update tagline to 'Auto, manual, or hybrid docs that never fall…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-26T10:56:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "994daded197f1bf2e3528de5f8a682da3f2b8f83",
          "body": "…urfaces\n\nSingle source of truth = root README (tagline in the blockquote, extended\ndescription in the next paragraph). Propagated to:\n- packages/cli/package.json `description` (npm) → extended description\n- CLI `--help` meta (index.ts) → tagline\n- server.json `description` (MCP Registry, 83/100 cha\n[…]\ne npm-facing packages/cli/README.md (was \"v0.1.x\", broken\n/reference/cli/ links, drift-prone feature lists) to mirror the minimal root\nREADME. Changeset (patch) for the npm-visible description change.",
          "is_bot": false,
          "headline": "docs: sync product tagline + description from the README across all s…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-26T10:41:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f2be46d1353c6b059dcabfd16753c491f7fa9213",
          "body": "…e, theme black/white)\n\n1. `clean` must preserve `.ovellum/orphans/` by default; an explicit `--orphans`\n   flag opts into removing the archive. Spec updated in cli.md (en+ja) + TODO note\n   (clean still unimplemented).\n2. Class-level `@preserve` protects only the class-level block — methods stay\n  \n[…]\ndard\n   palettes (nord/solarized/flexoki) follow their published spec. Policy in\n   STYLES.md §6.1a + a note in the themes guide (en+ja).\n\nDocs + one regression test; no behavior change, no changeset.",
          "is_bot": false,
          "headline": "docs: codify three product decisions (clean --orphans, @preserve scop…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-26T08:27:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cbd80bd570985412600e0545cb5332ef90404ea7",
          "body": null,
          "is_bot": false,
          "headline": "docs: link the MCP Registry listing from the README",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-26T08:27:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5181c2e561179f30aac2cd0bc5175087df2f6ed7",
          "body": "… site\n\n- site.landing.features[] gains an optional `href`: the whole card becomes a\n  link, site-relative (locale-prefixed automatically) or absolute (new tab).\n  Core type + validator + renderer (`renderFeatures` emits an <a> with\n  `.ov-feature-card-link`; calm hover via CSS). Plain cards unchang\n[…]\ntined, Deploy Anywhere — each\n  pointing into /docs (per-locale).\n\nTests: landing.test.ts (+2: link/external/plain + locale prefix). Docs en+ja\n(config reference `features[].href`). Changeset (minor).",
          "is_bot": false,
          "headline": "feat: linkable landing feature cards + AI-Native/MCP highlight on the…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-26T07:34:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "368d4bd85aa7082f8fc8c3f127886cf53bdbb728",
          "body": null,
          "is_bot": false,
          "headline": "docs: AI-native contribution guide (CONTRIBUTING + site docs, en+ja)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-26T07:26:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8a3407e5a970814b1b633628dc119425c29f948c",
          "body": "…ext Protocol (MCP)'",
          "is_bot": false,
          "headline": "docs(internal): rename AI-NATIVE-MCP.md → MCP.md, retitle 'Model Cont…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-26T07:24:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "129aa2a616fd1823680d265d9c46291574751523",
          "body": null,
          "is_bot": false,
          "headline": "docs(internal): record 0.16.0 + MCP registry live in publish state",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-26T06:32:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0e225a46fd53f0feb235ee6554113a0d38a21e5b",
          "body": null,
          "is_bot": false,
          "headline": "fix(mcp): trim server.json description to registry's 100-char limit",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-26T06:25:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "92b2df7dcbb8d439983a323c9cde8680bc6f055a",
          "body": null,
          "is_bot": false,
          "headline": "chore: version packages",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-26T06:17:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1d48e86d21066737df0b5e2b5aeb66cf6f757eb5",
          "body": "…ion ready)\n\nAdd the pieces the official MCP Registry needs so the Ovellum server can be\nlisted and discovered:\n\n- packages/cli/package.json gains `mcpName: io.github.oinam/ovellum` (the\n  registry verifies this from the published npm package).\n- repo-root server.json manifest: npm package `ovellum`\n[…]\n.\n- Docs note (automation guide en+ja) that Ovellum is in the MCP Registry.\n\nThe actual `mcp-publisher login/publish` is a human step after 0.16.0 is on npm\n(runbook in TODO-Human). Changeset (minor).",
          "is_bot": false,
          "headline": "feat: MCP Registry manifest — mcpName + server.json (registry submiss…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-26T06:16:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0cd2a865b24f05b8ea09c257d5941c06f829c29a",
          "body": null,
          "is_bot": false,
          "headline": "docs: refresh MCP tool/resource list in automation guide + FEATURES date",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-26T06:11:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7a6d9216af839a3a28af1c8ca186722cedc78aa7",
          "body": null,
          "is_bot": false,
          "headline": "docs(internal): sweep handoff state for the 0.15.0 release",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-25T20:02:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cfe0c3b93ea3c629157532e30eec5b77370bd972",
          "body": null,
          "is_bot": false,
          "headline": "chore: version packages",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-25T19:57:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d860c3341e8fbe4f02cb768805865fda4f96e43c",
          "body": "- ovellum_search_docs: full-text search over the built docs (dev/mcp/search.ts —\n  term-frequency over the output .md, title-match bonus, snippets). Not Pagefind:\n  its query runtime is browser-only WASM (the npm package only builds indexes),\n  so a built-in text search is mode-agnostic and dependen\n[…]\n\n\nTests: mcp-server.test.ts now 13 (search + reattach). Docs en+ja (mcp tool\ntable). Changeset (minor). AI-Native MCP arc complete (M1–M3); only the human\nMCP-registry submission remains (TODO-Human).",
          "is_bot": false,
          "headline": "feat: MCP tools ovellum_search_docs + ovellum_reattach (M3)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-25T18:20:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7b1bfffb1d959e00d4a70d7c7d4e63954aa61c17",
          "body": "… (M2)\n\n- Claude Code plugin at plugins/ovellum/ (.claude-plugin/plugin.json + .mcp.json\n  registering `npx -y ovellum mcp` + the bundled ovellum-docs skill, moved from\n  the old top-level skills/), listed by repo-root .claude-plugin/marketplace.json\n  → `/plugin marketplace add oinam/ovellum` + `/p\n[…]\naces over the existing non-TTY gate).\n\nRegistry/connector-directory submission is a human follow-up (TODO-Human).\nTests: plugin.test.ts (4). Changeset (minor). Plan: AI-NATIVE-MCP.md M2 done; M3 next.",
          "is_bot": false,
          "headline": "feat: one-step MCP adoption — Claude Code plugin + cross-tool install…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-25T17:22:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0e23a66d57362f7b88c564bdf531799abfdbd4ce",
          "body": "`ovellum mcp` now advertises capabilities:{tools,resources,prompts} and\nimplements the resources + prompts primitives, not just tools:\n\n- resources/{list,templates/list,read} (dev/mcp/resources.ts): ovellum://llms.txt,\n  ovellum://llms-full.txt, ovellum://page/{path} (template), ovellum://ir,\n  ovel\n[…]\n, templates, prompts list/get) + verified\ne2e over stdio. Docs en+ja (cli mcp reference). Changeset (minor).\n\nPlan: docs/internal/AI-NATIVE-MCP.md (M1 done; M2 distribution + M3 search/reattach next).",
          "is_bot": false,
          "headline": "feat: MCP Resources + Prompts — first-class MCP server (M1)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-25T16:35:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "99b1acb00867b7aff12ecaaf377209bd0b6f4547",
          "body": "- Add docs/internal/AI-NATIVE-MCP.md — the plan for making the MCP server a\n  first-class citizen (Resources + Prompts), one-step distribution (Claude Code\n  plugin + registry + cross-tool snippets), and rounding out tools\n  (ovellum_search_docs, ovellum_reattach). ROADMAP gets pickable M1–M3 entrie\n[…]\n+ `ovellum orphans`; config orphanRetention drops\n  \"a future\"; FEATURES \"Last updated\" refreshed. en+ja, re-stamped.\n\nAll 12 recently-shipped features verified present in the website docs + FEATURES.",
          "is_bot": false,
          "headline": "docs: AI-Native MCP plan + documentation completeness sweep",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-25T16:26:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2803e37ccab75bfcb8f0a62ff955dada072c8af2",
          "body": "Add an \"Embedding in another project's build\" section to the deploy guide\n(en+ja): point output into a host's served folder via config or\n`ovellum build --out/--base`, chain into the host's scripts (concurrently for\ndev, incremental watch), or drive it in-process with the D2 programmatic API;\nplus a manifest-based S3/CDN sync recipe. \"Ovellum never deploys — it builds a\nportable folder.\" Website-only, no changeset; ja anchors verified.",
          "is_bot": false,
          "headline": "docs: deploy recipes for embedding Ovellum in another build (D5)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-25T16:19:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "26edfb1ed6bfc63fd473d6948d8226cf1c44ced4",
          "body": "Import Ovellum as a library to drive it in-process instead of shelling out:\n`import { build, watch, loadConfig, defineConfig } from 'ovellum'`. build()\nreturns the structured BuildSummary; watch() returns a closable handle\n(incremental in auto/hybrid); loadConfig() returns the resolved config.\n\nSpli\n[…]\nay unpublished — no need to flip the bundled-private decision.\nCurated facade over runBuild/watchAndBuild.\n\nTests: api.test.ts (5). Docs en+ja (automation guide → Programmatic API).\nChangeset (minor).",
          "is_bot": false,
          "headline": "feat: programmatic API — `build()` / `watch()` from `ovellum` (D2)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-25T16:15:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cbcf27413c82983f2cfd8b7ef2cd84a03aa68c9c",
          "body": null,
          "is_bot": false,
          "headline": "docs(internal): sweep handoff state for 0.14.0 (published)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-25T15:52:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c5c1dee419059fa0b97ed80e42b8b7916b7725e7",
          "body": null,
          "is_bot": false,
          "headline": "chore: version packages",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-25T15:48:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8d1e1c562deb4d2465e8dac38c5999409b55c04b",
          "body": "--verbose prints config-resolution and per-stage / file-I/O detail to stderr:\nbuild logs parse timing, generated/wrote/merged per file, and ir/manifest paths\n(threaded as an onLog logger through runBuild → runBuildForMode →\nbuildProjectDocs); check logs config + locales + scanned-file count; diff lo\n[…]\n with C3.)\n\nTests: cli-smoke (build --verbose → stderr, summary still on stdout; --json\n--verbose → stdout valid JSON). Docs en+ja (build/check/diff flag tables +\nautomation guide). Changeset (minor).",
          "is_bot": false,
          "headline": "feat: `--verbose` on build / check / diff (U4)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-25T12:56:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "172af81ebe1152e540963134e87b6c6d20583ff5",
          "body": "`ovellum watch`/`dev` no longer re-parse the whole project on every save. In\nauto/hybrid mode the watcher keeps a warm ts-morph Project\n(parser createIncrementalParser/IncrementalParser): update() refreshes only the\nchanged files, re-extracts the whole project from the in-memory ASTs (cheap, so\ncros\n[…]\n).\n\nTests: parser incremental.test.ts (5) + cli incremental.test.ts (3); verified\nend-to-end via `ovellum watch` (edit one file → \"rebuilt 1 file(s)\"). Docs en+ja\n+ changeset. Tier A complete (A1–A7).",
          "is_bot": false,
          "headline": "feat: incremental watch builds for auto/hybrid (A7)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-25T03:29:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e71c847fbd0fd5db78c7cae1f772e7931d231012",
          "body": "In hybrid mode, a `@preserve`-tagged symbol's generated section is now wrapped in\na `@manual` protected zone keyed by the node's anchor id (templates.ts\nwrapPreserved; gated config.mode === 'hybrid' in generate.ts; top-level nodes +\nmethod members). The first build seeds the zone with generated cont\n[…]\n\nTests: generator preserve.test.ts (3) + cli preserve.test.ts (3, full\nseed→edit→survive→orphan cycle); merge-survival unaffected. Docs en+ja\n(anchors-and-zones concept + glossary). Changeset (minor).",
          "is_bot": false,
          "headline": "feat: `@preserve` auto-wrapping in the generator (A5)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-25T03:07:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8b2e0a9fcdfa86d8a4ef7e6dedc6554fa4fbaad0",
          "body": "--strict adds three checks on top of the defaults:\n- positional-zone: a <!-- @manual:start --> with no id= (fragile positional match)\n- stale-anchor: a generated-doc ovellum:anchor whose symbol is gone from the\n  source (findAnchors vs collectAnchorIds(parseProject))\n- missing-frontmatter: a page wi\n[…]\ntrict.test.ts (3, in-process). Docs en+ja (cli reference strict\nsection + automation issue kinds; ja anchors verified against generated slugs).\nThe website itself is --strict-clean. Changeset (minor).",
          "is_bot": false,
          "headline": "feat: `ovellum check --strict` — opt-in stricter validation (A6)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-25T02:39:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4d037120fde00e1896eb2ec682430c9de341b55e",
          "body": "…ose (A3/A4 write side)\n\nWalks the orphan archive one at a time and, per orphan, offers to reattach it\n(to a present-again anchor, a name-similar likely-rename, or a typed anchor),\ndelete it, or skip. Reattach splices the prose into a @manual zone under the\ntarget via the shared applyWriteZone — so \n[…]\nests: suggestReattachTarget + reattachOrphan (orphans.test.ts now 11) + non-TTY\nguard e2e. Docs en+ja (cli reference + orphans concept; ja anchors verified\nagainst generated slugs). Changeset (minor).",
          "is_bot": false,
          "headline": "feat: `ovellum orphans --reattach` — interactively rescue orphaned pr…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-25T02:07:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dec2fe14cede4503f50ef92b4a25568d4a6302a4",
          "body": null,
          "is_bot": false,
          "headline": "docs(internal): sweep handoff state for 0.13.0 (published)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-25T01:58:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "672bf78723694cc0952cf236e53ff68ff2def743",
          "body": null,
          "is_bot": false,
          "headline": "chore: version packages",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-25T01:45:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fce6ba421e8edac2d3a8229b32ad897d89148b37",
          "body": "Defense-in-depth; none were exploitable today.\n\n- S1 upgrade: argv-array spawn without a shell on POSIX (the command was already\n  a fixed allowlist); Windows keeps shell:true since .cmd shims require it.\n- S2 dev/serve: resolveFilePath now realpath-re-verifies the result stays under\n  the served ro\n[…]\nontent-length size guard.\n\nTests: dev-server symlink-escape + init-validate. Docs en+ja (security page,\nincl. an honest out-of-scope note now that passthrough symlinks are guarded).\nChangeset (patch).",
          "is_bot": false,
          "headline": "feat(security): harden the latent foot-guns (S1–S6)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-25T01:23:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2fb69c4b73d075738755755de536e8fdd9441dce",
          "body": "A short, hype-free concept page (concepts/ai-ready, en+ja) framing the AI-Ready\ntheme for adopters: read-ready (llms.txt + .md mirrors), agent-drivable (--json\n+ MCP), and — the differentiator — safely editable (an agent's prose into a\nprotected zone survives regeneration; rename detection + orphans\n[…]\nnding section so the queued\nlanding redesign isn't pre-empted.\n\nWebsite-only (not in the published package), so no changeset. Completes Tier C\n(C1-C5). Also drops a brittle doc-page count in FEATURES.",
          "is_bot": false,
          "headline": "docs: add \"Ovellum for AI agents\" positioning page (C5)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-25T00:52:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7b31133ab9c1b1394926f686be1d387a574ae945",
          "body": "Tell AI agents how to use Ovellum in the formats they look for:\n\n- `ovellum init` now scaffolds a mode-aware AGENTS.md at the project root\n  (renderAgentsMd). Hybrid/auto lead with the protected-zone contract (what\n  survives regeneration, what's overwritten, where orphans go); manual leads\n  with \"\n[…]\n the Automation guide for\n  one-copy adoption into .claude/skills/.\n\nAlso fixes a stale protected-zone marker in init's next-steps hint\n(ovellum:manual:start -> @manual:start). Docs en+ja + changeset.",
          "is_bot": false,
          "headline": "feat: agent packaging — scaffold AGENTS.md + ship a Claude Skill (C4)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-24T19:10:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a0a4c54366b6a389d0b755e98fd9c74bd7313aff",
          "body": "An agent or CI job shouldn't scrape human output. `build` and `check` gain\n--json (diff already had it): stdout becomes a single JSON object, no decorative\noutput, clean stderr on success.\n\n- build --json → { ok, command, mode, durationMs, config, warnings, ... } with\n  mode-specific fields (buildSu\n[…]\n0 / 1 / 3); ConfigError emitted as { ok:false, error, hint }\non the JSON path. New /docs/guides/automation/ guide (en+ja) documents the\nschemas, exit codes, MCP, and llms.txt. Changeset + smoke tests.",
          "is_bot": false,
          "headline": "feat: machine-readable CLI — --json on build and check (C3)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-24T18:59:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "89e817fb7fcceadc809b1fc560451cae918c67b5",
          "body": "`ovellum mcp` runs a dependency-free stdio MCP server (hand-rolled\nnewline-delimited JSON-RPC 2.0 — deliberately no SDK/zod, keeping the published\nCLI lean). Tools, all IR-backed and reusing the diff/orphans/query engines:\novellum_query_symbol, ovellum_diff, ovellum_list_orphans, ovellum_get_page\n(o\n[…]\nr,tools,write-zone}.ts; pure handlers + handleMessage unit-tested\nplus a real stdio smoke test. Deferred tools: ovellum_check (needs C3 --json),\novellum_search_docs (Pagefind). Docs en+ja + changeset.",
          "is_bot": false,
          "headline": "feat: add `ovellum mcp` server so agents drive Ovellum as a tool (C2)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-24T18:48:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8f047ac7ba17ae61100c3c9959f4a0a1701a93eb",
          "body": "…-only)\n\nWhen an anchor disappears and a similar symbol appears the same build (same\nkind, similar name, matching signature shape), pair them as a likely rename.\nPure dev/rename.ts detectRenames: kind gate + Levenshtein name similarity +\nsignature-shape similarity + same-file bonus, greedy best-firs\n[…]\nn orphaned block whose anchor probably just\nmoved triggers a \"did X become Y? ... reattach\" warning, computed over the\nprior IR snapshot. Suggest-only — reattach stays manual.\n\nDocs en+ja + changeset.",
          "is_bot": false,
          "headline": "feat: detect likely renames instead of orphaning blindly (A3, suggest…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-24T18:37:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "90d0424a6f726475940f2e0649d5e4674bd06b60",
          "body": "List orphaned @manual blocks under protect.orphanDir: anchor id, source doc,\nage, last-seen, block id, and — vs the .ovellum/ir.json snapshot — whether the\nanchor is back in source (reattachable), gone, or unknown. --stale filters to\n> protect.orphanRetention days; --json for CI. Read-only.\n\ncommand\n[…]\nphaned blocks from the prior IR snapshot's\ngeneratedAt. Interactive reattach/delete still by hand (planned).\n\nAlso ticks the stale B7 (i18n) and U8 (drafts) roadmap checkboxes. Docs en+ja\n+ changeset.",
          "is_bot": false,
          "headline": "feat: add `ovellum orphans` to review quarantined manual blocks (A4)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-24T18:28:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d41de1fe498a66a58e130f8f151212d9a230f4b2",
          "body": "Parse current source, load the persisted .ovellum/ir.json, and report\nadded/removed/changed symbols plus which output docs would change — writes\nnothing. Matches by anchor id (rename = remove+add), flattens class/interface\nmembers, ignores line/filePath so cosmetic shifts don't register, and maps\nso\n[…]\n machine-readable diff; --exit-code exits 1 on changes\n(git-diff style, default exits 0). Auto/hybrid only; missing/corrupt snapshot\nexits 1 with a hint to run `ovellum build`. Docs en+ja + changeset.",
          "is_bot": false,
          "headline": "feat: add `ovellum diff` to preview rebuild impact from the IR snapshot",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-24T18:01:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d9478d9a2e44f4a0a73695c54ee9710f4b221356",
          "body": "Every auto/hybrid build now writes the parsed DocProject to\n<cwd>/.ovellum/ir.json — build state at the project root (beside\n.ovellum/orphans/), unaffected by --out, gitignored. Reported as a new\n`ir:` summary line. Foundation for diff (A2), rename detection (A3), and\nanchor last-seen (A4). Manual mode writes none.",
          "is_bot": false,
          "headline": "feat: persist parsed IR to .ovellum/ir.json after auto/hybrid builds",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-24T17:51:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b92d351633685509ca1a4dc4df05d019ae70efa9",
          "body": null,
          "is_bot": false,
          "headline": "docs(internal): sweep handoff state for the 0.12.0 release",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-14T15:44:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "46f54f36dc381f0a817f26e876196dd0c31de45a",
          "body": "ovellum 0.11.0 → 0.12.0 (AI-Ready output + portable deploy-anywhere build).\nBumps site.version badge to v0.12.0.",
          "is_bot": false,
          "headline": "chore: version packages",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-14T15:35:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a1bf83212ee35b0833c36d953b6e613be3c291e2",
          "body": "…ywhere build\n\nsite.ai emits llms.txt / llms-full.txt / per-page .md mirrors (per-locale,\ndrafts+404 excluded, HTML byte-identical). ovellum build gains --out/--base\noverrides and --manifest (hashed deploy inventory). Docs en+ja, FEATURES,\nchangeset.",
          "is_bot": false,
          "headline": "feat: AI-Ready output (llms.txt + .md mirrors) and portable deploy-an…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-14T15:31:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 27,
      "commits_last_year": 312,
      "latest_release_at": "2026-07-18T15:51:21Z",
      "latest_release_tag": "ovellum@0.25.0",
      "releases_from_tags": false,
      "days_since_last_push": 5,
      "active_weeks_last_year": 11,
      "days_since_latest_release": 5,
      "mean_days_between_releases": 2.5
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 75,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "ovellum",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "documentation",
            "docs",
            "typescript",
            "javascript",
            "markdown",
            "mdx",
            "static-site-generator",
            "api-docs",
            "tsdoc",
            "jsdoc",
            "site-generator"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/ovellum",
          "is_deprecated": false,
          "latest_version": "0.25.0",
          "repository_url": "https://github.com/oinam/ovellum",
          "versions_count": 29,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 3095,
          "first_published_at": "2026-05-17T10:16:43.024000Z",
          "latest_published_at": "2026-07-18T15:51:16.988000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 1,
      "watchers": 1,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": null,
      "open_issues_and_prs": 1
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": true,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "packages/cli/tsconfig.json",
        "packages/core/tsconfig.json",
        "packages/generator/tsconfig.json",
        "packages/merger/tsconfig.json",
        "packages/parser/tsconfig.json",
        "packages/reader/tsconfig.json",
        "packages/site/tsconfig.json",
        "tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 72143,
      "source_files_sampled": 160,
      "oversized_source_files": 2,
      "agent_instruction_files": [
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 3592
    },
    "dependencies": {
      "manifests": [
        "package.json"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [
        {
          "name": "@inquirer/prompts",
          "manifest": "packages/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^8.4.3"
        },
        {
          "name": "c12",
          "manifest": "packages/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "3.3.4"
        },
        {
          "name": "chokidar",
          "manifest": "packages/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.0.0"
        },
        {
          "name": "citty",
          "manifest": "packages/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.2.2"
        },
        {
          "name": "gray-matter",
          "manifest": "packages/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.0.3"
        },
        {
          "name": "lucide",
          "manifest": "packages/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.16.0"
        },
        {
          "name": "pagefind",
          "manifest": "packages/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.5.2"
        },
        {
          "name": "rehype-autolink-headings",
          "manifest": "packages/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.1.0"
        },
        {
          "name": "rehype-raw",
          "manifest": "packages/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.0.0"
        },
        {
          "name": "rehype-sanitize",
          "manifest": "packages/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.0.0"
        },
        {
          "name": "rehype-slug",
          "manifest": "packages/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.0.0"
        },
        {
          "name": "rehype-stringify",
          "manifest": "packages/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^10.0.1"
        },
        {
          "name": "remark-parse",
          "manifest": "packages/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^11.0.0"
        },
        {
          "name": "remark-rehype",
          "manifest": "packages/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^11.1.2"
        },
        {
          "name": "shiki",
          "manifest": "packages/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.0.2"
        },
        {
          "name": "ts-morph",
          "manifest": "packages/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^28.0.0"
        },
        {
          "name": "unified",
          "manifest": "packages/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^11.0.5"
        },
        {
          "name": "unist-util-visit",
          "manifest": "packages/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.1.0"
        },
        {
          "name": "c12",
          "manifest": "packages/core/package.json",
          "ecosystem": "npm",
          "version_constraint": "3.3.4"
        },
        {
          "name": "@ovellum/core",
          "manifest": "packages/generator/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@ovellum/core",
          "manifest": "packages/merger/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@ovellum/reader",
          "manifest": "packages/merger/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@ovellum/core",
          "manifest": "packages/parser/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "ts-morph",
          "manifest": "packages/parser/package.json",
          "ecosystem": "npm",
          "version_constraint": "^28.0.0"
        },
        {
          "name": "@ovellum/core",
          "manifest": "packages/reader/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "gray-matter",
          "manifest": "packages/reader/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.0.3"
        },
        {
          "name": "@ovellum/core",
          "manifest": "packages/site/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@ovellum/reader",
          "manifest": "packages/site/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "gray-matter",
          "manifest": "packages/site/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.0.3"
        },
        {
          "name": "lucide",
          "manifest": "packages/site/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.16.0"
        },
        {
          "name": "pagefind",
          "manifest": "packages/site/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.5.2"
        },
        {
          "name": "rehype-autolink-headings",
          "manifest": "packages/site/package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.1.0"
        },
        {
          "name": "rehype-raw",
          "manifest": "packages/site/package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.0.0"
        },
        {
          "name": "rehype-sanitize",
          "manifest": "packages/site/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.0.0"
        },
        {
          "name": "rehype-slug",
          "manifest": "packages/site/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.0.0"
        },
        {
          "name": "rehype-stringify",
          "manifest": "packages/site/package.json",
          "ecosystem": "npm",
          "version_constraint": "^10.0.1"
        },
        {
          "name": "remark-directive",
          "manifest": "packages/site/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.0.0"
        },
        {
          "name": "remark-gfm",
          "manifest": "packages/site/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.0.0"
        },
        {
          "name": "remark-parse",
          "manifest": "packages/site/package.json",
          "ecosystem": "npm",
          "version_constraint": "^11.0.0"
        },
        {
          "name": "remark-rehype",
          "manifest": "packages/site/package.json",
          "ecosystem": "npm",
          "version_constraint": "^11.1.2"
        },
        {
          "name": "shiki",
          "manifest": "packages/site/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.0.2"
        },
        {
          "name": "unified",
          "manifest": "packages/site/package.json",
          "ecosystem": "npm",
          "version_constraint": "^11.0.5"
        },
        {
          "name": "unist-util-visit",
          "manifest": "packages/site/package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.1.0"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 1,
        "merged_prs": 2,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "brajeshwar",
          "commits": 310,
          "avatar_url": "https://avatars.githubusercontent.com/u/17795?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "deploy-website.yml",
        "lighthouse.yml",
        "release.yml",
        "website-preview.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        "eslint.config.js"
      ],
      "has_editorconfig": true,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "pnpm-lock.yaml"
      ],
      "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": 3,
            "reason": "branch protection is not maximal on development and all release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": null,
            "reason": "no pull request found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 3 contributing companies or organizations -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 0,
            "reason": "project was created within the last 90 days. Please review its contents carefully",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "no SAST tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 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": "630417b310ab021a9ee0c530194cb79d839e58b6",
        "ran_at": "2026-07-24T00:15:50Z",
        "aggregate_score": 2.8,
        "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-18T16:00:37Z",
      "oldest_open_prs": [
        {
          "number": 3,
          "created_at": "2026-06-13T16:37:11Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-06-08T01:20:42Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/oinam/ovellum",
    "host": "github.com",
    "name": "ovellum",
    "owner": "oinam"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 62,
      "inputs": {
        "security": 27,
        "vitality": 77,
        "community": 42,
        "governance": 59,
        "engineering": 93
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 77,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 62,
            "inputs": {
              "commits_last_year": 312,
              "human_commit_share": 1,
              "days_since_last_push": 5,
              "active_weeks_last_year": 11
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 5 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "11/52 weeks with commits",
                "points": 7.6,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 11
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "312 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 312
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "releases_count": 27,
              "latest_release_tag": "ovellum@0.25.0",
              "releases_from_tags": false,
              "days_since_latest_release": 5,
              "mean_days_between_releases": 2.5
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "27 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 27
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 5 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~2.5 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 2.5
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 42,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 1,
              "watchers": 1,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "1 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "1 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "good",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 77,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 6.3,
                "status": "met",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 58,
            "inputs": {
              "packages": [
                "ovellum"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 3095
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "3,095 downloads/month across npm",
                "points": 46.5,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 3095,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 59,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 20,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 3 contributing companies or organizations -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 72,
            "inputs": {
              "merged_prs": 2,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "2/2 decided PRs merged",
                "points": 38.2,
                "status": "met",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 2,
                      "decided": 2
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 59,
            "inputs": {
              "followers": 3,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "oinam",
              "public_repos": 99,
              "account_age_days": 5818
            },
            "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": "3 followers of oinam",
                "points": 4.3,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 3,
                      "login": "oinam"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "99 public repos, account ~15 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 99
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 15
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "ovellum"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 5
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 5 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "29 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 29
                    }
                  }
                ],
                "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": 93,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "excellent",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 88,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": true,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "5 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "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": "eslint.config.js",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "eslint.config.js"
                    }
                  }
                ],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 6.4,
                "status": "met",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "topics": [
                "documentation",
                "documentation-tool"
              ],
              "has_wiki": true,
              "homepage": "https://ovellum.oss.oinam.com",
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://ovellum.oss.oinam.com",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "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": "critical",
        "name": "Security",
        "value": 27,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "critical",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 27,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 15,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 3,
              "scorecard_aggregate": 2.8
            },
            "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 is not maximal on development and all release branches",
                "points": 2.2,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 3 contributing companies or organizations -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "no SAST tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "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": 3
            },
            "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": "good",
        "name": "AI Readiness",
        "value": 71,
        "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": 1,
              "agent_instruction_files": [
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 3592
            },
            "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": "100 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 100,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 54,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "pnpm-lock.yaml"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [
                "packages/cli/tsconfig.json",
                "packages/core/tsconfig.json",
                "packages/generator/tsconfig.json",
                "packages/merger/tsconfig.json",
                "packages/parser/tsconfig.json",
                "packages/reader/tsconfig.json",
                "packages/site/tsconfig.json",
                "tsconfig.json"
              ],
              "agent_commit_share": 0,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": "eslint.config.js",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "eslint.config.js"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "packages/cli/tsconfig.json, packages/core/tsconfig.json, packages/generator/tsconfig.json, packages/merger/tsconfig.json, packages/parser/tsconfig.json, packages/reader/tsconfig.json, packages/site/tsconfig.json, tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "packages/cli/tsconfig.json, packages/core/tsconfig.json, packages/generator/tsconfig.json, packages/merger/tsconfig.json, packages/parser/tsconfig.json, packages/reader/tsconfig.json, packages/site/tsconfig.json, tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "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": 99,
            "inputs": {
              "primary_language": "TypeScript",
              "largest_source_bytes": 72143,
              "source_files_sampled": 160,
              "oversized_source_files": 2
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "TypeScript (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "TypeScript"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "2/160 source files over 60KB",
                "points": 54.3,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 160,
                      "oversized": 2
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "moderate",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 60,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": true,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
    "deps.dev does not index npm:ovellum@0.25.0; advisories assessed against the repository dependency graph instead"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-24T00:15:55.788414Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/o/oinam/ovellum.svg",
  "full_name": "oinam/ovellum",
  "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.27.0 — full methodology · metrics wiki.

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