Public record
Software health reportschema 0.30.0 · metrics 2.5.0 · 2026-08-04 07:49 UTC

stefvw93 / weft

Weft is a reactive DOM library where every node is an Effect.

TypeScriptMIT★ 38 stars⑂ 1 forksince Oct 2025View on GitHub ↗

stefvw93/weft holds a health index of 65 out of 100, placing it in the Good band. It scores highest on Vitality (87/100) and lowest on Security (40/100). It was last updated today. A single contributor accounts for most of its recent work.

65
overall / 100
Good

Software health index

Metrics are grouped into weighted categories on one standardized 1–100 scale. Overall starts as their weighted mean, calibrated against the distribution of the public record so bands carry percentile meaning; when public evidence triggers the High-Risk Jurisdiction Policy, the rating is adjusted and receives an At Risk ceiling of 34.

65
Exceptional93-100The record's top tier (≈ top 5%); essentially all checked criteria met
Excellent80-92Strong across the board; minor gaps
Good65-79Healthy; gaps are limited and manageable
Moderate50-64Acceptable with notable gaps; review recommended
Weak35-49Material weaknesses across several areas
At Risk20-34Significant weaknesses; adoption warrants caution
Critical1-19Severe 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.

The weighted overall 60 is calibrated to 65 on the published index scale (record calibration 2026-08-02).

Ownership

Stef van WijchenPersonal account
14 followers23 public repossince Jul 2015OWOW

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

Package ecosystems

RegistryPackageVersionDownloads / moVersionsLast publishTags
npmwebsitepoints to another repo — not scored0.1.11,67724829 days agoscrapingweb
npm@weftui/dom0.31.02,0882210 days agodomeffecthydrationrendererssrweft
npm@weftui/core0.31.02,2562210 days agocombinatorsdomeffectreactivessruiweft
npm@weftui/router0.31.01,8952110 days agoeffectnested-routesrouterroutingssrweft

Metrics by category

Vitality

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

87Excellent · 21% of overall
How it's scored
36/36Push recency — last push 0 days ago
13.8/36Commit cadence — 20/52 weeks with commits
18/18Commit volume — 593 commits in the last year
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 12 issue activity found in the last 90 days -- score normalized to 10
Inputs used
commits_last_year593
human_commit_share0.87
days_since_last_push0
active_weeks_last_year20

Release discipline

100Exceptional
How it's scored
27/27Ships releases — 45 releases published
36/36Release recency — latest release 10 days ago
27/27Release cadence — a release every ~2.2 days
0/10OpenSSF Scorecard: Signed-Releases — no data
Inputs used
releases_count45
latest_release_tagv0.31.0
releases_from_tagsno
days_since_latest_release10
mean_days_between_releases2.2
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?

46Weak · 17% of overall
How it's scored
25.4/60Stars — 38 stars
0/25Forks — 1 forks
0/15Watchers — 2 watchers
Inputs used
forks1
stars38
watchers2
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
How it's scored
22.5/22.5README
22.5/22.5License — recognized license (MIT)
0/18CONTRIBUTING guide
0/13.5Code of conduct
0/7.2Issue template
6.3/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
readme_badges1
has_contributingno
has_issue_templateno
has_code_of_conductno
readme_badge_servicesgithub.com
has_pull_request_templateyes
How it's scored
50.6/80Monthly downloads — 6,239 downloads/month across npm
0/20Registry dependents — not reported by this ecosystem
Inputs used
packages@weftui/dom, @weftui/core, @weftui/router
dependents
ecosystemsnpm
total_downloads
monthly_downloads6,239
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?

45Weak · 23% 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
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Inputs used
bus_factor1
contributors_sampled1
top_contributor_share1
How it's scored
8.4/42Issue resolution — 20% of issues closed
19.6/30PR acceptance — 107/164 decided PRs merged
0/13Newcomer PR acceptance — no first-time contributor's PR decided in 30d
0/15OpenSSF Scorecard: Code-Review — Found 0/16 approved changesets -- score normalized to 0
Inputs used
merged_prs107
open_issues12
closed_issues3
prs_merged_7d0
prs_decided_7d0
prs_merged_30d14
prs_decided_30d14
issue_closed_ratio0.2
closed_unmerged_prs57
first_time_authors_30d0
first_time_prs_merged_30d0
first_time_prs_decided_30d0
Excluded from scoring (no data or not applicable): newcomer_pr_acceptance. Remaining weights renormalized.
How it's scored
10/30Ownership backing — personal (user) account
0/20Verified domain — not applicable to user accounts
8.5/25Owner reach — 14 followers of stefvw93
22.1/25Track record — 23 public repos, account ~11 yr old
Inputs used
followers14
owner_typeUser
is_verified
owner_loginstefvw93
public_repos23
account_age_days4,025
Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.

Package maintenance

100Exceptional
How it's scored
25/25Published & resolvable — 3 package(s) on npm
35/35Publish recency — latest publish 10 days ago
20/20Version history — 22 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packages@weftui/dom, @weftui/core, @weftui/router
ecosystemsnpm
any_deprecatedno
min_days_since_publish10

Engineering Quality

Are baseline engineering and documentation practices in place?

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

Documentation

85Excellent
How it's scored
30/30README
25/25Documentation directory
0/15Documentation / homepage site
10/10Repository description
10/10Topics — 3 topics
10/10Wiki
Inputs used
topicseffect-ts-community-nl, effect, typescript
has_wikiyes
homepage
has_readmeyes
has_docs_diryes
has_descriptionyes

Security

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

40Weak · 16% of overall
How it's scored
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
2.5/2.5CI-Tests — 24 out of 24 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/16 approved changesets -- score normalized to 0
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5License — license file detected
7.5/7.5Maintained — 30 commit(s) and 12 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — no data
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — no data
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 16 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate4.1
Excluded from scoring (no data or not applicable): packaging, signed_releases. Remaining weights renormalized.
How it's scored
17.9/35Direct dependencies free of known advisories — 1 affected: request 2.20.0 (moderate 6.1)
2.4/25Indirect dependencies free of known advisories — 8 affected: underscore 1.4.4 (critical 9.8), form-data 0.0.10 (high 7.5), hawk 0.10.2 (high 7.5), +5 more
15.2/40No advisories left outstanding — 9 advisory-carrying package(s) unaddressed past 90 days; oldest published 3,205 days ago
Inputs used
sourceosv
advisories18
affected_packages9
assessed_packages40
unassessed_packages0
affected_by_severitycritical 1, high 6, moderate 2
direct_affected_packages1
Matched the npm:website@0.1.1 runtime dependency closure — what installing the published package pulls in — 40 packages. Reachability is not analyzed.

AI Readiness

How well is the repo equipped to be developed and maintained with AI coding agents? Carries a deliberately small weight (4%): agent tooling is a real maintenance signal, but a repository with none can still reach 100/100.

71Good · 4% of overall
How it's scored
45/45Agent instructions — CLAUDE.md
0/15Machine-readable docs (llms.txt)
40/40Legible commit history — 87 of 87 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_bytes16,995
How it's scored
0/18One-command bootstrap
22/22Automated tests
0/11Lint / format config
11/11Static type checking — examples/async-data-loading/tsconfig.json, examples/declarative-event-handlers/tsconfig.json, examples/effect-atom/tsconfig.json, examples/element-ref/tsconfig.json, examples/error-boundary/tsconfig.json, examples/form-handling/tsconfig.json, examples/headless-menu/tsconfig.json, examples/keyed-list/tsconfig.json, examples/list-rendering/tsconfig.json, examples/reactive-styles/tsconfig.json, examples/router-client/tsconfig.json, examples/router-ssr/tsconfig.json, examples/server-boundary/tsconfig.json, examples/shared-state-islands/tsconfig.json, examples/ssr-hydration/tsconfig.json, examples/subscription-ref/tsconfig.json, examples/suspense/tsconfig.json, examples/type-augmentation/tsconfig.json, packages/core/tsconfig.json, packages/dom/tsconfig.json, packages/router/tsconfig.json, packages/vite/tsconfig.json, website/tsconfig.json
10/10Reproducible environment — lockfile
10/10Demonstrated agent practice — 70 of the last 100 commits agent-authored or agent-credited
8/8Automated maintenance — 13 of the last 100 commits are automated dependency updates
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_configno
typecheck_configsexamples/async-data-loading/tsconfig.json, examples/declarative-event-handlers/tsconfig.json, examples/effect-atom/tsconfig.json, examples/element-ref/tsconfig.json, examples/error-boundary/tsconfig.json, examples/form-handling/tsconfig.json, examples/headless-menu/tsconfig.json, examples/keyed-list/tsconfig.json, examples/list-rendering/tsconfig.json, examples/reactive-styles/tsconfig.json, examples/router-client/tsconfig.json, examples/router-ssr/tsconfig.json, examples/server-boundary/tsconfig.json, examples/shared-state-islands/tsconfig.json, examples/ssr-hydration/tsconfig.json, examples/subscription-ref/tsconfig.json, examples/suspense/tsconfig.json, examples/type-augmentation/tsconfig.json, packages/core/tsconfig.json, packages/dom/tsconfig.json, packages/router/tsconfig.json, packages/vite/tsconfig.json, website/tsconfig.json
agent_commit_share0.7
toolchain_manifests
dependency_bot_commit_share0.13
How it's scored
45/45Type-checkable code — TypeScript (statically typed)
54.4/55Manageable file sizes — 3/266 source files over 60KB
Inputs used
primary_languageTypeScript
largest_source_bytes314,907
source_files_sampled266
oversized_source_files3
How it's scored
0/40API schema (OpenAPI/GraphQL/proto)
0/20MCP server
40/40Runnable examples — demos, examples
Inputs used
example_dirsdemos, examples
has_mcp_signalno
api_schema_files

Key facts

38GitHub stars
1contributors
593commits, last 12 months
0days since last push
45releases
1bus factor
12open issues
npmpackage ecosystems

Data collection warnings

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • npm package 'website' points at a different repository (https://github.com/akoenig/node-website); excluded from ecosystem scoring
  • Could not fetch npm package '@weftui/vite' from its registry
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

More detail

OpenSSF Scorecard 4.1 / 10
4.1aggregate

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-08-04 07:49 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
10CI-Tests24 out of 24 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/16 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 12 issue activity found in the last 90 days -- score normalized to 10
n/aPackagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
n/aSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities16 existing vulnerabilities detected
Direct dependencies 7
RegistryPackageVersion constraintManifest
npm@weftui/coreworkspace:*website/package.json
npm@weftui/domworkspace:*website/package.json
npm@weftui/routerworkspace:*website/package.json
npmeffectcatalog:website/package.json
npm@weftui/coreworkspace:*packages/dom/package.json
npm@weftui/coreworkspace:*packages/router/package.json
npm@weftui/domworkspace:*packages/router/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

Dependency advisories 9

Installing npm:website@0.1.1 pulls in 40 packages, direct and transitive: 9 carry known advisories, of which 1 are direct dependencies.

PackageVersionRelationSeverityAdvisoriesFixed in
underscore1.4.4indirectcritical21.13.8
form-data0.0.10indirecthigh24.0.6
hawk0.10.2indirecthigh29.0.1
hoek0.7.6indirecthigh29.0.3
http-signature0.9.11indirecthigh10.10.0
mime1.2.11indirecthigh12.0.3
qs0.5.6indirecthigh56.14.1
request2.20.0directmoderate23.0.0
tunnel-agent0.3.0indirectmoderate10.6.0

An advisory means the version recorded in the dependency graph falls inside an advisory’s affected range. Reachability is not analysed, and the graph includes development and test pins — a finding may concern tooling rather than shipped software.

Raw JSON report machine-readable
{
  "data": {
    "repo": {
      "topics": [
        "effect-ts-community-nl",
        "effect",
        "typescript"
      ],
      "is_fork": false,
      "size_kb": 6643,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "CSS": 4058,
        "JavaScript": 11428,
        "TypeScript": 1584495
      },
      "pushed_at": "2026-08-03T09:11:20Z",
      "created_at": "2025-10-08T16:35:29Z",
      "owner_type": "User",
      "updated_at": "2026-07-26T09:01:25Z",
      "description": "Weft is a reactive DOM library where every node is an Effect.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript"
      ]
    },
    "owner": {
      "blog": "stefvanwijchen.com",
      "name": "Stef van Wijchen",
      "type": "User",
      "login": "stefvw93",
      "company": "OWOW",
      "location": "Oisterwijk",
      "followers": 14,
      "avatar_url": "https://avatars.githubusercontent.com/u/13518365?v=4",
      "created_at": "2015-07-27T08:39:02Z",
      "is_verified": null,
      "public_repos": 23,
      "account_age_days": 4025
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.31.0",
          "kind": "minor",
          "published_at": "2026-07-24T14:42:23Z"
        },
        {
          "tag": "v0.30.0",
          "kind": "minor",
          "published_at": "2026-07-22T19:13:10Z"
        },
        {
          "tag": "v0.29.0",
          "kind": "minor",
          "published_at": "2026-07-20T12:41:38Z"
        },
        {
          "tag": "v0.28.0",
          "kind": "minor",
          "published_at": "2026-07-19T12:27:07Z"
        },
        {
          "tag": "v0.27.1",
          "kind": "patch",
          "published_at": "2026-07-17T11:59:18Z"
        },
        {
          "tag": "v0.27.0",
          "kind": "minor",
          "published_at": "2026-07-17T10:05:41Z"
        },
        {
          "tag": "v0.26.3",
          "kind": "patch",
          "published_at": "2026-07-04T20:31:34Z"
        },
        {
          "tag": "v0.26.2",
          "kind": "patch",
          "published_at": "2026-07-04T19:54:42Z"
        },
        {
          "tag": "v0.26.1",
          "kind": "patch",
          "published_at": "2026-07-04T18:22:45Z"
        },
        {
          "tag": "v0.26.0",
          "kind": "minor",
          "published_at": "2026-07-04T18:19:23Z"
        },
        {
          "tag": "v0.25.0",
          "kind": "minor",
          "published_at": "2026-07-03T19:36:38Z"
        },
        {
          "tag": "v0.24.0",
          "kind": "minor",
          "published_at": "2026-07-03T11:51:16Z"
        },
        {
          "tag": "v0.23.3",
          "kind": "patch",
          "published_at": "2026-07-03T11:09:17Z"
        },
        {
          "tag": "v0.23.2",
          "kind": "patch",
          "published_at": "2026-07-03T10:50:27Z"
        },
        {
          "tag": "v0.23.1",
          "kind": "patch",
          "published_at": "2026-07-02T20:06:20Z"
        },
        {
          "tag": "v0.23.0",
          "kind": "minor",
          "published_at": "2026-07-02T20:00:21Z"
        },
        {
          "tag": "v0.22.0",
          "kind": "minor",
          "published_at": "2026-07-02T17:53:35Z"
        },
        {
          "tag": "v0.21.0",
          "kind": "minor",
          "published_at": "2026-06-12T07:50:08Z"
        },
        {
          "tag": "v0.20.9",
          "kind": "patch",
          "published_at": "2026-06-09T20:03:00Z"
        },
        {
          "tag": "v0.20.8",
          "kind": "patch",
          "published_at": "2026-06-08T13:10:07Z"
        },
        {
          "tag": "v0.19.0",
          "kind": "minor",
          "published_at": "2026-06-08T07:48:24Z"
        },
        {
          "tag": "v0.18.0",
          "kind": "minor",
          "published_at": "2026-06-05T18:18:26Z"
        },
        {
          "tag": "v0.17.0",
          "kind": "minor",
          "published_at": "2026-06-04T15:32:59Z"
        },
        {
          "tag": "v0.16.2",
          "kind": "patch",
          "published_at": "2026-06-01T18:52:32Z"
        },
        {
          "tag": "v0.16.1",
          "kind": "patch",
          "published_at": "2026-06-01T18:22:05Z"
        },
        {
          "tag": "v0.16.0",
          "kind": "minor",
          "published_at": "2026-06-01T17:38:08Z"
        },
        {
          "tag": "v0.15.0",
          "kind": "minor",
          "published_at": "2026-05-31T13:15:58Z"
        },
        {
          "tag": "v0.14.0",
          "kind": "minor",
          "published_at": "2026-05-31T11:01:11Z"
        },
        {
          "tag": "v0.13.0",
          "kind": "minor",
          "published_at": "2026-05-30T17:16:13Z"
        },
        {
          "tag": "v0.12.0",
          "kind": "minor",
          "published_at": "2026-05-29T14:35:52Z"
        },
        {
          "tag": "v0.11.0",
          "kind": "minor",
          "published_at": "2026-05-29T12:11:29Z"
        },
        {
          "tag": "v0.10.0",
          "kind": "minor",
          "published_at": "2026-05-28T18:44:10Z"
        },
        {
          "tag": "v0.9.0",
          "kind": "minor",
          "published_at": "2026-05-28T07:53:46Z"
        },
        {
          "tag": "v0.8.1",
          "kind": "patch",
          "published_at": "2026-05-24T19:44:13Z"
        },
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2026-05-24T19:07:09Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2026-05-24T07:18:17Z"
        },
        {
          "tag": "v0.6.1",
          "kind": "patch",
          "published_at": "2026-05-22T12:48:25Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-05-22T08:08:48Z"
        },
        {
          "tag": "v0.5.2",
          "kind": "patch",
          "published_at": "2026-02-28T11:47:07Z"
        },
        {
          "tag": "v0.5.1",
          "kind": "patch",
          "published_at": "2026-02-28T11:17:08Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-01-22T20:55:43Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-01-22T13:21:02Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-01-22T12:59:52Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-01-22T11:41:14Z"
        },
        {
          "tag": "v0.1.1",
          "kind": "patch",
          "published_at": "2026-01-12T19:26:48Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "cfad421c40f74a7a3d3efa0f71caaa2cdb7d1997",
          "body": "…(#170)\n\n* feat(dom)!: add Loom app-level render scheduler (fixes #167, #168, #169)\n\nOne scheduler per WeftApp: every reactive region and prop is a\nlatest-value cell drained by a single flush fiber. Bursts conflate\n(latest-value-wins), commits run in registration order (outer before\ninner), and flus\n[…]\nrules\n(correcting false claims is mandatory, adding machinery detail is not).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dom)!: Loom app-level render scheduler (fixes #167, #168, #169) …",
          "author_name": "Stef van Wijchen",
          "author_login": "stefvw93",
          "committed_at": "2026-07-24T14:39:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9b620e67f0e8d49c7b77c1e8315dfa87fd572638",
          "body": "* docs: raise code/prose ratio in tutorial pages 01-04\n\nRewrite the four tutorial pages around one continuous counter app.\nFix two API inaccuracies: Node resolves to an ElementDescriptor, not a\nDOM node, and server rendering requires AppRpcClientTag in context.\n\nCo-Authored-By: Claude Fable 5 <norep\n[…]\n.md\nwere already fixed in an earlier commit; confirmed not reproducible here.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Docs/code ratio pass (#166)",
          "author_name": "Stef van Wijchen",
          "author_login": "stefvw93",
          "committed_at": "2026-07-22T20:01:21Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d56857d90f045cd41ba9f7bf6e3559e4ebf449c2",
          "body": null,
          "is_bot": false,
          "headline": "docs: simplify root check",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-22T19:43:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bd5b754b15c418451fd5a5be70f13ba6f2be2e32",
          "body": "* docs: raise code/prose ratio in tutorial pages 01-04\n\nRewrite the four tutorial pages around one continuous counter app.\nFix two API inaccuracies: Node resolves to an ElementDescriptor, not a\nDOM node, and server rendering requires AppRpcClientTag in context.\n\nCo-Authored-By: Claude Fable 5 <norep\n[…]\n.md's typed-failure example.\n\n* docs: fix oxfmt formatting\n\nvp check --fix cleanup across the branch (missed before earlier commits).\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Docs/code ratio pass (#165)",
          "author_name": "Stef van Wijchen",
          "author_login": "stefvw93",
          "committed_at": "2026-07-22T19:33:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0224e0ded33143aab2d33e650c9ef38db31e223c",
          "body": "* feat(core)!: make Subscribable data-first (brand-only interface)\n\nEffect 4 removed its Subscribable module; Weft's local replacement kept\nthe Effect 3 member-style shape. The public interface is now brand-only\nwith covariant phantom variance, and reads go through module accessors,\nmatching Effect \n[…]\n) and observe changes with\nSubscribable.changes(x).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n* chore: dont mandate pr\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(core)!: make Subscribable data-first (brand-only interface) (#164)",
          "author_name": "Stef van Wijchen",
          "author_login": "stefvw93",
          "committed_at": "2026-07-22T19:11:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "746b96532dc47e8052ec37b2b0d0a1a53050ee0d",
          "body": null,
          "is_bot": false,
          "headline": "docs: add client routing example",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-22T18:16:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "70af6ca221a19a5855092abf11b9ae7487099855",
          "body": null,
          "is_bot": false,
          "headline": "docs: improve routing docs",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-22T18:16:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dad35ec24e1c0a59fc99f1dc90d68c34285375a8",
          "body": null,
          "is_bot": false,
          "headline": "docs: add more example code",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-22T17:53:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "efd5a5499b05e5996b91a776c0517063a18008fe",
          "body": "Fans out multiple sub-agents; pinning avoids inheriting a pricier\nsession model and keeps token cost predictable.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(review-step): pin code-review sub-agents to Sonnet 5",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-20T14:01:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "49c6825f4b19528536d2de8fb5e46d4490d8c8c4",
          "body": "* feat(dom): add Props.merge and Props.cx for prop-bag composition\n\nWeft's answer to Base UI-style composition. A behavior primitive owns aria\nwiring, handlers and refs; the consumer owns the element. Because elements are\nplain data made by plain calls, ownership never leaves the consumer, so the\non\n[…]\ntry as its own <p>\nvia List.each instead of one joined string.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dom): add Props.merge and Props.cx for prop-bag composition (#157)",
          "author_name": "Stef van Wijchen",
          "author_login": "stefvw93",
          "committed_at": "2026-07-20T12:39:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "553c123def5171d7a37bae190f07d10d78b0e9cb",
          "body": "…(#156)\n\n* docs: adopt terse JSDoc and docs-prose style rules\n\nRewrite the CLAUDE.md Documentation section with the new JSDoc rules\n(one-liners for self-evident exports, block length cap, no em-dashes)\nand add a Docs Prose Style subsection. Sync the same rules into the\nweft-docs-author agent and the\n[…]\npass, including the file that was\npreviously failing on import.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: adopt terser JSDoc/prose style and retrofit the whole codebase …",
          "author_name": "Stef van Wijchen",
          "author_login": "stefvw93",
          "committed_at": "2026-07-19T18:06:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "915eb9ed371bcda9ddb84708e3c949ceb5853d7a",
          "body": "One app = one lazy ManagedRuntime + one root Scope + one unhandled-error\nhub; each mount/hydrate creates a child root scope. Layer services are\nshared by reference across roots, so multi-root islands get cross-island\nreactive state for free.\n\n- New `WeftApp` namespace in @weftui/dom/client: make, mo\n[…]\nApp.mount(app, node, root)` /\n`WeftApp.hydrate(app, node, root)`; `Effect.provide` around mount calls\nno longer supplies services to components.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dom)!: replace mount/hydrate with the WeftApp app runtime (#155)",
          "author_name": "Stef van Wijchen",
          "author_login": "stefvw93",
          "committed_at": "2026-07-19T12:25:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "87cfb5e316a392ccf23df7bc4ba6a30634720b5a",
          "body": "…t (#154)\n\nThe popstate handler forks commitTo onto a detached fiber and the\nNavigating emit is a further forkChild behind it, so a single tick after\ndispatching the event is occasionally not enough on slow CI runners.\nPoll for the Navigating state (the file's existing convention for\nbackground-fiber timing) — safe because the gated leaf blocks the commit,\nso the mid-flight window cannot be skipped.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: fix flaky mid-flight Navigating assertion in AC-R8 popstate tes…",
          "author_name": "Stef van Wijchen",
          "author_login": "stefvw93",
          "committed_at": "2026-07-18T10:29:33Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3cd50721af8fe7308ff29a4e5a6beffc30debb43",
          "body": "* build: migrate type tests to TSTyche\n\nReplace the hand-rolled Expect<Equal<>> helpers and bare @ts-expect-error\nassertions in the 13 type-test files with TSTyche 7 matchers, renaming\n*.test-d.ts to *.tst.ts (and normalizing the stray combinator.test-d.ts\ninto __type-tests__/). Type tests now run v\n[…]\nnoreply@anthropic.com>\n\n* chore: prune gitignored plans/ from knowledge graph\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "build: migrate type tests to TSTyche (#153)",
          "author_name": "Stef van Wijchen",
          "author_login": "stefvw93",
          "committed_at": "2026-07-18T10:23:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f40032da85925e30aa47469b56e994ea97657029",
          "body": "- typescript ^6.0.3 -> ^7.0.2 (native Go compiler); vp pack d.ts emit\n  now uses the experimental tsgo backend, output verified equivalent\n  to the 6.0.3 baseline (cosmetic diffs only)\n- vite-plus 0.2.2 -> 0.2.5 via vp migrate (adds TS7 declaration\n  generation support)\n- replace @effect/language-se\n[…]\n  tsserver plugins do not run under the TS7 native LSP; run\n  `pnpm lsp:patch` after install to patch the local binary. The\n  tsconfig plugins block is unchanged - @effect/tsgo reads the same\n  config",
          "is_bot": false,
          "headline": "build: upgrade to TypeScript 7 and Vite+ 0.2.5 (#152)",
          "author_name": "Stef van Wijchen",
          "author_login": "stefvw93",
          "committed_at": "2026-07-18T07:37:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4e8e9e374b838e0bfe7fc7a34c629859b9684360",
          "body": "Bumps [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) from 4.1.9 to 4.1.10.\n- [Release notes](https://github.com/vitest-dev/vitest/releases)\n- [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md)\n- [Commits](https://github.com/vitest-dev/vitest/commit\n[…]\nirect:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "deps(deps): bump vitest from 4.1.9 to 4.1.10 (#138)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-18T06:36:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "571990fef1a8fcc00f2c011ff244c9943a506cbc",
          "body": "* deps(deps): bump @types/node from 25.9.2 to 26.1.1\n\nBumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 25.9.2 to 26.1.1.\n- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)\n- [Commits](https://github.com/DefinitelyTyped/Defi\n[…]\nauthored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>\nCo-authored-by: stefvw93 <stef@stefvanwijchen.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": true,
          "headline": "deps(deps): bump @types/node from 25.9.2 to 26.1.1 (#146)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-18T06:33:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0031e8453f013ce7fdf5f5088a0c65cbc9070037",
          "body": "Bumps [@shikijs/rehype](https://github.com/shikijs/shiki/tree/HEAD/packages/rehype) from 3.23.0 to 4.3.1.\n- [Release notes](https://github.com/shikijs/shiki/releases)\n- [Commits](https://github.com/shikijs/shiki/commits/v4.3.1/packages/rehype)\n\n---\nupdated-dependencies:\n- dependency-name: \"@shikijs/\n[…]\nrect:development\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "deps(deps-dev): bump @shikijs/rehype from 3.23.0 to 4.3.1 (#139)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-18T06:32:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0bf27210b4ba2f51a43d201e81f7e4ff329ea32d",
          "body": "…#145)\n\nBumps [@effect/language-service](https://github.com/Effect-TS/language-service) from 0.86.4 to 0.87.0.\n- [Release notes](https://github.com/Effect-TS/language-service/releases)\n- [Changelog](https://github.com/Effect-TS/language-service/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/\n[…]\nrect:development\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "deps(deps-dev): bump @effect/language-service from 0.86.4 to 0.87.0 (…",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-18T06:24:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f78698c5fd8b51d39c071d45a87fa2cb6a55b3dc",
          "body": "Bumps [tsx](https://github.com/privatenumber/tsx) from 4.22.4 to 4.23.1.\n- [Release notes](https://github.com/privatenumber/tsx/releases)\n- [Changelog](https://github.com/privatenumber/tsx/blob/master/release.config.cjs)\n- [Commits](https://github.com/privatenumber/tsx/compare/v4.22.4...v4.23.1)\n\n--\n[…]\nirect:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "deps(deps): bump tsx from 4.22.4 to 4.23.1 (#148)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-18T06:24:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a8ef155d2f40df65611078a65ba6b37c0ed8b8fc",
          "body": "…-5.6.18\n\ndeps(deps-dev): bump daisyui from 5.6.6 to 5.6.18",
          "is_bot": false,
          "headline": "Merge pull request #147 from stefvw93/dependabot/npm_and_yarn/daisyui…",
          "author_name": "Stef van Wijchen",
          "author_login": "stefvw93",
          "committed_at": "2026-07-18T06:20:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a39750749f73c31b69d16a777d8c46a5bbe16dba",
          "body": "…ment-dependencies-703aab683a\n\ndeps(deps-dev): bump @types/hast from 3.0.4 to 3.0.5 in the development-dependencies group",
          "is_bot": false,
          "headline": "Merge pull request #144 from stefvw93/dependabot/npm_and_yarn/develop…",
          "author_name": "Stef van Wijchen",
          "author_login": "stefvw93",
          "committed_at": "2026-07-18T06:20:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b973232848840dc67efde03417549a2a76f2c5af",
          "body": "…ns/configure-pages-6\n\nci(deps): bump actions/configure-pages from 5 to 6",
          "is_bot": false,
          "headline": "Merge pull request #143 from stefvw93/dependabot/github_actions/actio…",
          "author_name": "Stef van Wijchen",
          "author_login": "stefvw93",
          "committed_at": "2026-07-18T06:19:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5181536dce1054978130f046dcbbbe1889974ab8",
          "body": "…ns/upload-pages-artifact-5\n\nci(deps): bump actions/upload-pages-artifact from 4 to 5",
          "is_bot": false,
          "headline": "Merge pull request #141 from stefvw93/dependabot/github_actions/actio…",
          "author_name": "Stef van Wijchen",
          "author_login": "stefvw93",
          "committed_at": "2026-07-18T06:19:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "56499c74c4a7afb283bc768adb3846e3e249c43e",
          "body": "…ns/deploy-pages-5\n\nci(deps): bump actions/deploy-pages from 4 to 5",
          "is_bot": false,
          "headline": "Merge pull request #142 from stefvw93/dependabot/github_actions/actio…",
          "author_name": "Stef van Wijchen",
          "author_login": "stefvw93",
          "committed_at": "2026-07-18T06:19:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e3ef2aad1f27f5db3d3ca25fc954a3e7c515160c",
          "body": "…browser-playwright-4.1.10\n\ndeps(deps): bump @vitest/browser-playwright from 4.1.9 to 4.1.10",
          "is_bot": false,
          "headline": "Merge pull request #137 from stefvw93/dependabot/npm_and_yarn/vitest/…",
          "author_name": "Stef van Wijchen",
          "author_login": "stefvw93",
          "committed_at": "2026-07-18T06:18:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3d7574e751a820b811d69731293368dbd77ee364",
          "body": "….3.1\n\ndeps(deps-dev): bump shiki from 3.23.0 to 4.3.1",
          "is_bot": false,
          "headline": "Merge pull request #136 from stefvw93/dependabot/npm_and_yarn/shiki-4…",
          "author_name": "Stef van Wijchen",
          "author_login": "stefvw93",
          "committed_at": "2026-07-18T06:18:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f88f96ab3430655d72c63c736eb83a0f393418bf",
          "body": "…c-release/github-12.0.9\n\ndeps(deps-dev): bump @semantic-release/github from 12.0.8 to 12.0.9",
          "is_bot": false,
          "headline": "Merge pull request #135 from stefvw93/dependabot/npm_and_yarn/semanti…",
          "author_name": "Stef van Wijchen",
          "author_login": "stefvw93",
          "committed_at": "2026-07-18T06:18:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f5304847118f65f3e611a8a84b469ab33b9ba140",
          "body": "docs: repoint effect 4 reference clone to canonical Effect-TS/effect",
          "is_bot": false,
          "headline": "Merge pull request #151 from stefvw93/docs/effect-smol-to-canonical-repo",
          "author_name": "Stef van Wijchen",
          "author_login": "stefvw93",
          "committed_at": "2026-07-18T05:57:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b06ef31d32e1ec869b2f1b068790be9cf88425bb",
          "body": "effect-smol merged into Effect-TS/effect and was archived read-only;\nEffect 4 development now lives on that repo's main branch (v3 on the\nv3 branch). Update the AI-agent reference-clone docs accordingly:\n\n- CLAUDE.md \"Effect 4 Reference\": clone Effect-TS/effect main as\n  ./effect-src, note main=v4/v\n[…]\no no runtime code, package versions, or peer ranges change. The\nbump-effect-beta automation is untouched (verified via --dry-run).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: repoint effect 4 reference clone to canonical Effect-TS/effect",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-18T05:46:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3c7ed03136aad4f83ee4a577f01fd244057b17d3",
          "body": "…mp-98\n\nEffect beta automation + bump to 4.0.0-beta.98",
          "is_bot": false,
          "headline": "Merge pull request #150 from stefvw93/chore/effect-beta-automation-bu…",
          "author_name": "Stef van Wijchen",
          "author_login": "stefvw93",
          "committed_at": "2026-07-17T11:56:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "26f565aed941e94ecff861ca72074718638ee1fb",
          "body": "Moves the tested floor from 4.0.0-beta.93: catalog pin, peer ranges\n(>=4.0.0-beta.98 <4.0.0), and the tested-against doc tokens.\n\nMigrates @weftui/router for two upstream renames in the beta line\n(confirmed against the installed dist):\n- HttpApi.Any -> HttpApi.Top\n- HttpApiEndpoint name -> identifie\n[…]\nlders are gone too — buildHttpApi\n  already used the options form, so only prose needed updating.\n\nvp run check / test / test:browser all green.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(deps): bump effect to 4.0.0-beta.98",
          "author_name": "Stef van Wijchen",
          "author_login": "stefvw93",
          "committed_at": "2026-07-17T11:54:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6b896dc9352b9f92aa647391234c7cfdac9b8672",
          "body": "…mantics\n\nAdds the /effect-beta skill, scripts/bump-effect-beta.mjs (rewrites the\ncatalog pin, peer floors, and doc tested-floor tokens together), and a\ndaily workflow that bumps to the latest 4.0.0-beta.N, validates, and\nopens a fix(deps) PR (draft when validation is red).\n\nAlso corrects stale Effe\n[…]\nped → acquireRelease-backed Layer.effect,\nand the unobserved-fiber logging description (Weft now watches region\nexits and logs failures itself).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: add effect-beta bump automation and sync docs with Effect 4 se…",
          "author_name": "Stef van Wijchen",
          "author_login": "stefvw93",
          "committed_at": "2026-07-17T11:54:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a24d1b09588d47db6794e84fe928202afb8c5b1e",
          "body": "fix(release): keep breaking changes as minor bumps while pre-1.0",
          "is_bot": false,
          "headline": "Merge pull request #149 from stefvw93/fix/semver-guard-pre-1.0",
          "author_name": "Stef van Wijchen",
          "author_login": "stefvw93",
          "committed_at": "2026-07-17T10:03:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a0e0445b05eb36afe39b317bd57f4c8af78e445f",
          "body": "semantic-release's default commit-analyzer rule maps breaking changes to a\nmajor bump with no 0.x awareness, which pushed the Effect 4 migration out as\n1.0.0. Override breaking -> minor until Weft intentionally goes 1.0 (remove\nthis rule at that point).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(release): keep breaking changes as minor bumps while pre-1.0",
          "author_name": "Stef van Wijchen",
          "author_login": "stefvw93",
          "committed_at": "2026-07-17T09:17:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d6fbac06f7dddd2dd53d78e56a05cd84303c5e62",
          "body": "Bumps [@vitest/browser-playwright](https://github.com/vitest-dev/vitest/tree/HEAD/packages/browser-playwright) from 4.1.9 to 4.1.10.\n- [Release notes](https://github.com/vitest-dev/vitest/releases)\n- [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md)\n- [Commits](https://git\n[…]\nname: \"@vitest/browser-playwright\"\n  dependency-version: 4.1.10\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "deps(deps): bump @vitest/browser-playwright from 4.1.9 to 4.1.10",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-17T09:12:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f4011e565dabec5f643bca315fed05f550ad3c98",
          "body": "Bumps [@semantic-release/github](https://github.com/semantic-release/github) from 12.0.8 to 12.0.9.\n- [Release notes](https://github.com/semantic-release/github/releases)\n- [Commits](https://github.com/semantic-release/github/compare/v12.0.8...v12.0.9)\n\n---\nupdated-dependencies:\n- dependency-name: \"@semantic-release/github\"\n  dependency-version: 12.0.9\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "deps(deps-dev): bump @semantic-release/github from 12.0.8 to 12.0.9",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-17T09:12:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "82ec5530f96d0a5be2d511c14f020f91be7a3b89",
          "body": "Migrate to Effect 4 (effect@4.0.0-beta.93)",
          "is_bot": false,
          "headline": "Merge pull request #131 from stefvw93/feat/effect-4-migration",
          "author_name": "Stef van Wijchen",
          "author_login": "stefvw93",
          "committed_at": "2026-07-17T09:09:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "daa869e60c78f5d0c275512f1b1effa8f37deafd",
          "body": null,
          "is_bot": false,
          "headline": "chore: docs author",
          "author_name": "Stef van Wijchen",
          "author_login": "stefvw93",
          "committed_at": "2026-07-17T07:08:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e42e7c00909f86730f8ad95421cacdcab1d7f8e3",
          "body": "Bumps [daisyui](https://github.com/saadeghi/daisyui/tree/HEAD/packages/daisyui) from 5.6.6 to 5.6.18.\n- [Release notes](https://github.com/saadeghi/daisyui/releases)\n- [Changelog](https://github.com/saadeghi/daisyui/blob/master/CHANGELOG.md)\n- [Commits](https://github.com/saadeghi/daisyui/commits/v5\n[…]\nncies:\n- dependency-name: daisyui\n  dependency-version: 5.6.18\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "deps(deps-dev): bump daisyui from 5.6.6 to 5.6.18",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-13T09:12:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d8be06a5c9d26ad31d33a6795ec5def9035bf750",
          "body": "Bumps the development-dependencies group with 1 update: [@types/hast](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/hast).\n\n\nUpdates `@types/hast` from 3.0.4 to 3.0.5\n- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)\n- [Commits](https://github.com/De\n[…]\ncy-version: 3.0.5\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n  dependency-group: development-dependencies\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "deps(deps-dev): bump @types/hast in the development-dependencies group",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-13T09:09:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "16540b045b66ea616cee9f983f846c2a65a82ae8",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(graphify): refresh knowledge graph",
          "author_name": "Stef van Wijchen",
          "author_login": "stefvw93",
          "committed_at": "2026-07-12T07:55:07Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bb75db2e6b28231f73ac9a2a0b74e1ebbc302755",
          "body": "…DE.md\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(effect4): document the effect-smol local reference clone in CLAU…",
          "author_name": "Stef van Wijchen",
          "author_login": "stefvw93",
          "committed_at": "2026-07-12T07:53:58Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "caf81a85c94eccd70e3e37128d9c32c42b890ccc",
          "body": "@effect-atom/atom has been upstreamed into Effect 4 as the built-in\nunstable module effect/unstable/reactivity (Result -> AsyncResult,\nRegistry.layer -> AtomRegistry.layer; Atom API unchanged). Drop the\nexternal dependency, re-include the example in the pnpm workspace, and\nremove the lint/format/bro\n[…]\nter's initial render before\nclicking: v4 atoms are lazy, so an update fired before the first\nsubscriber is live is not retained by the registry.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(effect4): migrate effect-atom example to effect/unstable/reactivity",
          "author_name": "Stef van Wijchen",
          "author_login": "stefvw93",
          "committed_at": "2026-07-12T07:53:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4202d38ad91e6a075aa62a2c53ac7e4ecefa11e3",
          "body": "Bumps [actions/configure-pages](https://github.com/actions/configure-pages) from 5 to 6.\n- [Release notes](https://github.com/actions/configure-pages/releases)\n- [Commits](https://github.com/actions/configure-pages/compare/v5...v6)\n\n---\nupdated-dependencies:\n- dependency-name: actions/configure-pages\n  dependency-version: '6'\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "ci(deps): bump actions/configure-pages from 5 to 6",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-06T14:34:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8d97f41f2838d94f0c55144a05cacd860406b1fd",
          "body": "Bumps [actions/deploy-pages](https://github.com/actions/deploy-pages) from 4 to 5.\n- [Release notes](https://github.com/actions/deploy-pages/releases)\n- [Commits](https://github.com/actions/deploy-pages/compare/v4...v5)\n\n---\nupdated-dependencies:\n- dependency-name: actions/deploy-pages\n  dependency-version: '5'\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "ci(deps): bump actions/deploy-pages from 4 to 5",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-06T14:34:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1893c4763fa7c636f36c404a781f2c3a45689dc4",
          "body": "Bumps [actions/upload-pages-artifact](https://github.com/actions/upload-pages-artifact) from 4 to 5.\n- [Release notes](https://github.com/actions/upload-pages-artifact/releases)\n- [Commits](https://github.com/actions/upload-pages-artifact/compare/v4...v5)\n\n---\nupdated-dependencies:\n- dependency-name: actions/upload-pages-artifact\n  dependency-version: '5'\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "ci(deps): bump actions/upload-pages-artifact from 4 to 5",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-06T14:33:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "285bc30470f417798f1e8ca5350c40041626e658",
          "body": "Bumps [shiki](https://github.com/shikijs/shiki/tree/HEAD/packages/shiki) from 3.23.0 to 4.3.1.\n- [Release notes](https://github.com/shikijs/shiki/releases)\n- [Commits](https://github.com/shikijs/shiki/commits/v4.3.1/packages/shiki)\n\n---\nupdated-dependencies:\n- dependency-name: shiki\n  dependency-version: 4.3.1\n  dependency-type: direct:development\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "deps(deps-dev): bump shiki from 3.23.0 to 4.3.1",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-06T09:09:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f7551a083ce19295e8beece3613d077e57ee37e1",
          "body": "CI failed (green locally) because examples/effect-atom is excluded from the pnpm\nworkspace — so its deps (effect, @weftui/*, @effect-atom/atom) aren't installed\nin a clean checkout, and type-aware lint can't resolve its imports (TS2307 x14).\nLocally it passed only on stale node_modules. Add examples/effect-atom/** to the\nlint + fmt ignorePatterns until @effect-atom/atom ships an Effect 4 build.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci(effect4): exclude effect-atom example from lint/format check",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-06T07:29:54Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0640b42265a6b64440055e0900b6a8f8d976e88e",
          "body": "Phase 11. The client-first Boundary.rpc test relied on a 30ms Effect.delay being\nlonger than mount time to observe the fallback before the swap — a race that\nflaked intermittently under Effect 4's fiber scheduling. Gate the rpc resolve on\na test-controlled Deferred instead: the call provably parks u\n[…]\nthe test opens\nthe gate, so the fallback is deterministically observable, then opening it drives\nthe swap. 3/3 isolated runs pass.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(effect4): gate Boundary.rpc mount test on a Deferred (de-flake)",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T15:13:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1a3bc289b39daa74444b08f4a5850e95d27ae047",
          "body": "Phase 11. The httpApi-spine test's HttpApiView typed endpoint params/query/error\nas Schema.Top, but Schema.decodeUnknownSync/decodeUnknownResult need a Codec —\nTS2345 ('Top' not assignable to ConstraintDecoder). Type the view's schemas as\nSchema.Codec<unknown, unknown> (the runtime values are codecs) and drop the now-\nredundant Schema.Top cast. vp run check is green (exit 0, 0 type/format issues).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(effect4): compile.test schemas typed as Codec for decode calls",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T15:09:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "563c75d9101e224db807a92a2d42818c2cc20778",
          "body": "Phase 11. vp check reformats markdown code fences (project convention uses\n'yield *' with a space, and aligned tables); the docs-agent's edits introduced\n'yield*' which oxfmt normalizes back. Apply vp check --fix so the committed docs\nmatch a clean vp run check.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "style(effect4): restore oxfmt markdown convention in migrated docs",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T15:06:09Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "32e1a561aa6bc415156d67f326652635766a40b0",
          "body": "… README)\n\nPhase 10 (weft-docs-author agent, final batch). Refinement pass on\nboundaries-and-suspense.md + ssr-hydration readme + dom/README (SubscriptionRef\n.changes function form, Boundary catch* names). Completes the docs sweep.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(effect4): final docs-agent edits (boundaries, ssr-hydration, dom…",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T15:02:48Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b7d3ad6d4d855f9e2c758bdaba52f8bcff3e5645",
          "body": "…ng docs\n\nPhase 10 straggler. Effect 4 renamed the class form to Schema.TaggedErrorClass\n(no bare Schema.TaggedError); RouterNotFound/RouterParamsError are modeled with it.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(effect4): Schema.TaggedError -> Schema.TaggedErrorClass in routi…",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T15:01:11Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ce046f940a6f6e7d76b5839783f3d92a430583f0",
          "body": "Phase 10 (weft-docs-author agent, cont.). Verified: Subscribable.changes stays a\nmember (Weft keeps the v3 accessors on its own Subscribable); only SubscriptionRef\n.changes/.get became functions. No residual Effect-3 refs.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(effect4): author-components + use-element-refs prose migration",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T15:00:16Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "849599a7973a4628221d2527a5a06998ab48a852",
          "body": "…onRef.changes fn)\n\nPhase 10 (weft-docs-author agent, cont.). reactive-primitives + element-ref\nreadmes: SubscriptionRef .changes/.get member access -> the function form\nSubscriptionRef.changes(ref); form-handling readme: Schema.filter -> Schema.check\n(Schema.makeFilter(...)); core README Boundary table: catchAll/catchSome/\ncatchAllCause -> catch/catchFilter/catchCause. Verified no residual Effect-3 refs.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(effect4): more prose/readme migrations (Schema.check, Subscripti…",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T14:59:24Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ce7f35c6a84fa3982293965c938d4baa4522dd9e",
          "body": "Phase 10 (weft-docs-author agent). Update docs/ (tutorial, explanation, how-to,\nreference) and the example readmes to the migrated APIs: @effect/rpc ->\neffect/unstable/rpc and @effect/platform -> effect/unstable/{http,httpapi};\nContext.Tag -> Context.Service; Schema.Schema -> Schema.Codec; Boundary \n[…]\nmString->NaN routing caveat; and Subscribable now from\n@weftui/core. Verified: no residual Effect-3 API references remain in docs.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(effect4): migrate prose docs + example readmes to Effect 4 APIs",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T14:57:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c966ee4bac183b60839998e665eab44384562d5a",
          "body": "Phase 10 stragglers. Effect 4 represents log levels as strings, so comments\nreferencing LogLevel.Error now say the \"Error\" level; and the link navigate\ndispatch comment references Effect.runForkWith (v4) instead of Runtime.runFork.\nComment-only — no behavior change.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(effect4): fix stale API names in source comments",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T14:55:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ba3d30280c09d1de0ece66a117fc8fa413b48aee",
          "body": "Phase 10 follow-up: the last @effect/platform reference — server dispatch runs\nthrough effect/unstable/httpapi HttpApiBuilder in Effect 4.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(effect4): router.specs HttpApiBuilder is in effect/unstable/httpapi",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T14:53:01Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5146af0833c488963dec332609ee3a85f5b4f478",
          "body": "Phase 10. Context.Tag -> Context.Service (Router, Router.Outlet, SuspenseContext,\nBoundaryContext, Greeting, Docs); Effect.catchAll -> Effect.catch and\nEffect.catchAllCause -> Effect.catchCause; Boundary.catchAll -> Boundary.catch;\nand note the router M7/M8 caveat that Effect 4 NumberFromString maps non-numeric\nstrings to NaN (needs an explicit finite check to 404 on non-numbers).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(effect4): update remaining specs to v4 APIs",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T14:52:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3900b7dcf0842f018b0180a1f30d466552dbbff3",
          "body": "Phase 10. @effect/rpc -> effect/unstable/rpc; Schema.Schema<any, any> ->\nSchema.Codec<any, any>; AppRpcClientTag uses the Context.Service form\n(Context.Service<Self, Shape>()(id)). Rpc field names (payloadSchema/\nsuccessSchema/errorSchema) are unchanged in v4, so those stay.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(effect4): update boundary-rpc.specs to v4 imports/types",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T14:49:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "19150209b3e06d5fa4b0d8b1865591290b570021",
          "body": "Phase 10. Rename the failure-boundary spec references to the migrated names:\ncatchAll -> catch, catchAllCause -> catchCause, catchSome -> catchFilter (now a\npositional Filter + fallback, mirroring Effect 4's Effect.catchFilter — no longer\nan Option-returning props object). Update the match semantics (Cause.failureOption\n-> Cause.findErrorOption; Filter Result.success/fail) and the API-surface block.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(effect4): update boundary.specs to v4 Boundary API",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T14:48:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9b173fce851048c6917cdbc2a4f79ef28df2de0e",
          "body": "AST-only refresh of the code graph (3338 nodes, 4798 edges) reflecting the\nEffect 4 migration changes across packages and examples.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(effect4): update graphify knowledge graph after migration",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T14:42:47Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e455587caae9a92acdd64454b7aad4cb317c61c2",
          "body": "Phase 9 (browser tests). Effect 4's Effect.runSyncExit uses a bare runtime with\nno services, so renderNode's sync-resolution probe failed for any component that\nreads a service (e.g. a route leaf reading Router) — forcing it onto the async\nstream-marker path. A later static render (the resolve-befor\n[…]\nigation\npatchQuery browser test (browser suite now fully green). Also folds in oxfmt\nformatting of two migrated router test files.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(effect4): sync-resolution probe runs under the ambient context",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T14:41:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0c63b9067f285bf1e1cf439784a0da29f07d58a0",
          "body": "Phase 9. Formatting-only changes (oxfmt ternary parenthesization and line\ncollapsing) that vp check --fix applied during the migration but were left\nuncommitted because earlier commits staged only the substantive edits. Commit\nthem so the committed tree matches a clean vp run check.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "style(effect4): apply oxfmt formatting to migrated files",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T14:28:41Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7183b9c3c9c2930028933b56133ea112e23b5564",
          "body": "…shims\n\nPhase 9 (browser tests). The Effect 4 rpc HTTP transport posts to /_eui/rpc/\n(normalized trailing slash), but the shims matched the exact string /_eui/rpc,\nso they never intercepted the request — it hit the real fetch and returned an\nempty/failed response (app client-first) or a stale value (refetch). Strip a\ntrailing slash before matching. Fixes the app + refetch rpc round-trip browser\ntests (4 -> 1 failing).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(effect4): match /_eui/rpc with optional trailing slash in fetch …",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T14:19:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f30f6349b126fb9dbaa09c74ade4ffdbf70f5715",
          "body": "Phase 9 (browser tests). Effect 4's rpc web handler streams its ndjson response\nbody from a scope that closes when the handler returns; relaying that live stream\nstraight through the test's window.fetch override delivers an empty body to the\nrpc client (\"Received empty HTTP response\"). Read the resp\n[…]\nansport (its\nassertions now exercise real stock values); the app client-first mount has a\nfurther timing issue tracked separately.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(effect4): buffer rpc web-handler response in browser fetch shims",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T14:13:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "22d8f9c4854b0876e43a74cae62480999468bc8d",
          "body": "Phase 9 (browser tests). Two mismatches broke the Boundary.rpc round-trip:\n- RpcServer.layerHttp defaults to the websocket protocol; pass protocol:\"http\"\n  so the server speaks the same HTTP transport as the client's layerProtocolHttp.\n- The HTTP transport streams each rpc message, so layerJson conc\n[…]\ne-delimited).\n\nError advanced from a decode failure to an empty/500 response (server-side rpc\nhandling still under investigation).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(effect4): RPC over HTTP uses protocol:http + ndjson serialization",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T14:04:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d6c00126ba26a18274ae08ad6fc3e38bfe53fc95",
          "body": "Phase 9 (browser tests). examples/effect-atom is excluded from the pnpm\nworkspace pending an Effect 4 build of @effect-atom/atom; its browser test pulls\neffect@3-only APIs (NoSuchElementException, GenericTag, SyncScheduler) that break\nthe browser build's dep optimization. Exclude it from vitest.browser.config.ts\ntoo, mirroring the workspace exclusion.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(effect4): exclude effect-atom example from browser test run",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T13:50:53Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e5ebacc46b60bdb1b160928b5c87b518ce7922ae",
          "body": "Phase 9 (tests). Effect 4 runs Effect.sleep(\"0 millis\") synchronously, so the\nSSR sync-resolution probe (runSyncExit) resolved the Card inline and emitted no\nstream-start markers, failing the hydrate round-trip assertion. Use a 1ms sleep\nso the async path (with reactive-region markers) is taken as intended.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(effect4): force async SSR path with sleep(1 millis) in round-trip",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T13:48:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2385b2e4d814f179296a41deb7a3618a9d6e2249",
          "body": "Phase 9 (tests). Effect 4 forks the reactive-prop subscription lazily, so the\nStream.make(\"a\", \"b\") id had only adopted the server value \"a\" when unmount tore\nthe subscription down, leaving id=\"a\". Wait a tick (like AC-H11) so the sync\nstream drains to \"b\" before unmount; the idempotent-unmount assertion is\nunchanged.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(effect4): let reactive prop settle before unmount in AC-H9",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T13:46:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5770e58ada3b7a03aec42178cf0bbc85ea57a57f",
          "body": "…terrupt\n\nPhase 9 (tests). Effect 4 forks resolution fibers lazily (Effect.forkIn defers\nthe first step), so when the main walk fails before a just-forked fiber runs, it\nis discarded un-started and the child's onInterrupt never fires — the v3 proxy\nthe test relied on. Assert the real guarantee inste\n[…]\nling\nEffect.never boundary, the enclosing Effect.scoped still completes (a leaked\nfiber would hang it) and the shell Effect fails.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(effect4): AC-SH2 asserts no-leak via scoped completion, not onIn…",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T13:44:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "59a7b9d7f817ba7e12184152877f02f1f17b827b",
          "body": "…ng fibers\n\nPhase 9 (tests, AC-SH6). The patch stream ends only at a terminal None, offered\nby the last-settling boundary or the no-suspense fast path. If the scope closes\nwhile resolution fibers are still pending (consumer disconnect), those fibers are\ninterrupted before offering None, so a patch consumer hangs. Add a scope\nfinalizer that offers None on close; harmless after a normal close (None already\nsent). Fixes AC-SH6.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(effect4): terminate SSR patch stream when scope closes with pendi…",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T13:42:45Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2efeffa55bef563e61d9a7b542e2207d7e37dd5b",
          "body": "Phase 9 (tests). Effect 4's Schema.NumberFromString maps a non-numeric string to\nNaN and succeeds, so /users/abc decoded to { id: NaN } and matched instead of\n404-ing. M7 (path-param decode failure is a no-match) needs a schema that\ngenuinely fails; add a finite check to the fixture's :id so 'abc' is a real\ndecode failure. Real numeric-param routes wanting a 404 on non-numbers need the\nsame guard under v4.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(effect4): matcher M7 fixture rejects NaN for :id decode failure",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T13:28:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "55da9fdc857f0313aa7fe23e75be9418da933975",
          "body": "Phase 9 (tests). The httpApi-spine tests read the v3 endpoint shape\n(pathSchema/urlParamsSchema Options, a single errorSchema). Effect 4 endpoints\nexpose params/query (Schema.Top | undefined) and error as a ReadonlySet of\nschemas, each carrying its own httpApiStatus annotation. Update HttpApiView an\n[…]\ns/query defined + decode; iterate the error set for the\n404-annotated RouterNotFound schema. Drop unused Option/SchemaAST imports.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(effect4): compile.test asserts v4 HttpApiEndpoint structure",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T13:24:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2fb2b12c39451cb252d1a1521487b040bf21d87c",
          "body": "Phase 9 (tests). Effect 4 HttpApiEndpoint handlers receive request.params /\nrequest.query (not v3's request.path / request.urlParams). The SSR leaf handler\nbuilt a Matched with undefined path/query, so the outlet's pick(fields, record)\ncrashed with 'Cannot read category/id/oid of undefined'. Read request.params /\nrequest.query. Fixes the website SSR route cluster.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(effect4): SSR match reads v4 handler request.params/query",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T13:20:57Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "327ed9ada6c9431820b19daf78724be5d93080d3",
          "body": "…usly\n\nPhase 9 (tests). renderChildren — the shared array/fragment path — routed every\nEffect/Stream child through handleStreamChild (async stream markers). Static\nNodes are Effects (and iterable under Effect 4), so array/fragment children,\nmulti-child elements, and synchronous Suspense children ren\n[…]\nchronous); only genuinely reactive Effects/Streams\ntake the stream path. Fixes the dominant dom rendering cluster (suspense 6->1).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(effect4): renderChildren renders static-markup children synchrono…",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T13:18:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9da3d539a50da74cc54687ff33c122cabc2b885e",
          "body": "Phase 9 (tests). renderSuspenseBoundary wrapped every Effect/Stream child in a\nfunction-component so it registers with the boundary — but static-markup Nodes\nare Effects too, so they were wrapped and rendered by an async fiber that,\nunder Effect 4, doesn't complete at mount (children absent). Fast-p\n[…]\n static Nodes straight through to renderNode (synchronous);\nthey never suspend anyway. Mirrors the renderElement static-child fix.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(effect4): pass static-markup children through suspense boundary",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T13:10:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "73b4cd798e6e7cb5c7e5a86f0c0fec2acd234c4d",
          "body": "…tionRef\n\nPhase 9 (tests). The AC-9 identity pass-through tests passed a SubscriptionRef\nand expected toSubscribable to return it by reference — only valid in v3 where\nSubscriptionRef was a Subscribable subtype. Build an explicit Subscribable.make\nview of the ref so isSubscribable short-circuits it (no ref/fiber forked) and\nthe identity + get assertions hold.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(effect4): source identity tests use a Subscribable, not Subscrip…",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T13:09:02Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "60b5eb5782ff037ac0f6df51ca0c4ec03cd62e1b",
          "body": "Phase 9 (tests). Effect 4's HttpApiEndpoint stores path/query schemas as\nendpoint.params / endpoint.query (Schema.Top | undefined), not the v3\nendpoint.pathSchema / endpoint.urlParamsSchema Options. compileMatchers'\nOption.getOrElse(endpoint.pathSchema, ...) read undefined and crashed with\n'Cannot r\n[…]\n emptySchema;\nupdate EndpointShape; drop the unused Option import. Fixes the dominant test\nfailure cluster (matcher/link routing).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(effect4): matcher reads v4 HttpApiEndpoint params/query slots",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T13:05:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "93153e7f70c2d87f33988ecdc02411d976ca4b6d",
          "body": "Phase 9 (tests). renderElement routed every Effect/Stream child through the\nasync stream path (handleStreamChild + forkSupervised). Static-markup Nodes are\nEffects too, so they were rendered by a forked fiber that, under Effect 4's\nscheduling, no longer completes synchronously during mount — leaving\n[…]\ny reactive Effects/Streams\nthrough the stream path. (+4 tests; the router/HttpApi and dom-fragment failure\nclusters are separate.)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(effect4): render static-markup element children synchronously",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T13:02:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1431d781baadad042eeb05c02d7a1e06fc3e7f5e",
          "body": "…rence\n\nPhase 9 (final type error). Effect 4 makes Effect/Stream iterable (Yieldable —\ntheir Symbol.iterator yields the Effect, which is itself a Renderable), so an\nEffect/Stream child ambiguously satisfies Renderable's Iterable<Renderable>\nmember. Without a const type parameter TS then widens the c\n[…]\n UserService|DbService>.\n(Upstream is removing Effect.Yieldable — effect-smol#2163 — which will make the\nconst unnecessary later.)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(effect4): const type param on h children preserves tuple E/R infe…",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T12:49:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5102f81dc71e5774ed33bfb6f5eee461e113829f",
          "body": "Phase 9. This test exercised the toSubscribable identity pass-through via a\nSubscriptionRef, which only worked because v3 SubscriptionRef was a Subscribable\nsubtype. v4 dropped that, so build an explicit Subscribable.make view of the ref\nand pass that as the Source; the underlying SubscriptionRef stays external and\nthe alive-after-unmount assertions are unchanged.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(effect4): pass a Subscribable (not SubscriptionRef) as Source",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T12:37:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "67efa7b8d54f989327ad369220136abeda2dd61e",
          "body": "Phase 9. Object.entries widens each style value to any; CSS values are\nstring | number, so assert that before String() to avoid the no-base-to-string\nlint (which would otherwise flag a possible '[object Object]').\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(effect4): satisfy no-base-to-string on style value stringify",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T12:35:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8c366451987d24aa58131151fd58b5d730691de5",
          "body": "Phase 9. The catchSome({ fallback: () => Option.none() }) -> catchFilter(Filter.\nmake(...)) conversion removed the only Option uses in these two tests; drop the\nnow-unused Option import (no-unused-vars).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(effect4): drop unused Option imports after catchFilter migration",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T12:34:33Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "34de4a735562098b254c95dfc491e4e25158e7db",
          "body": "Phase 9. Effect 4 renamed Fiber.RuntimeFiber -> Fiber.Fiber. Even though the\neffect-atom example is excluded from the workspace build (@effect-atom/atom has\nno v4 release), vp check still type-checks its files, and they resolve effect@4\nfine at the type level — so migrate this last effect-3 API rather than special-\ncase the type-checker.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(effect4): effect-atom test Fiber.RuntimeFiber -> Fiber.Fiber",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T12:32:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ac6a9567c14d02d36ce67bd8996c0fac5f24d715",
          "body": "Phase 9. Layer<never, unknown, unknown> (from Layer.provide(... as any)) isn't\nassignable to Layer<any, any, any> under v4 Layer variance. Drop the explicit\nannotations on apiRoutes/rpcRoutes and let inference stand; the downstream\nLayer.mergeAll(...) as any at HttpRouter.toWebHandler already loosens the type.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(effect4): drop router-server route-layer annotations",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T12:30:27Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "02e0a7adfc1b1374a7e9492e855a31eea51074df",
          "body": "Phase 9. Effect 4 made Schema.Literal single-argument. The RouterParamsError\n'source' field's two literals become Schema.Literals([\"path\", \"query\"]), which\nalso restores the \"path\" | \"query\" union so router-service.ts's\nnew RouterParamsError({ source: \"query\", ... }) type-checks (the field type had\ncollapsed to just the first literal).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(effect4): RouterParamsError source uses Schema.Literals",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T12:28:13Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "467e2a97d7d9e580144752ae6ce5d1acdbd64314",
          "body": "Phase 9. Effect 4 Stream.filterMap filters+maps via a Filter, not an\nOption-returning function. The SubscriptionRef.changes(ref) stream carries\nOption<A>; keep-and-unwrap the Some values with\nFilter.fromPredicateOption(identity) (passes when the predicate returns Some,\nyielding the inner value). Add the Filter import.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(effect4): Stream.filterMap takes a Filter (source.ts)",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T12:27:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f4cca4c5542472e7041dab044bb31dea0b6a6c26",
          "body": "Phase 9. A namespace cannot express 'export { catch_ as catch }' (TS1194 —\nexport declarations are not permitted in a namespace), so Boundary.catch was\nimpossible with Boundary as a namespace. Extract the namespace body to\nboundary-impl.ts as module-level exports (where the catch alias is valid, the\n[…]\n / .Resource etc. are unchanged for consumers. Symbols\n(FAILURE/SUSPENSE/SERVER_BOUNDARY) and CatchTag(s)E stay flat-exported too.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(core): extract Boundary to a module for the reserved-word catch",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T12:24:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8d32a5c3e879a0bfb93d96cf90100a3ab0f71b98",
          "body": "Phase 9. Effect 4 removed HttpApiSchema.getStatusErrorAST. HttpApiSchema.status(code)\nstores the code as an httpApiStatus annotation on the AST, so read it directly:\n(m.annotations as { httpApiStatus?: number })?.httpApiStatus. Drop the now-unused\nHttpApiSchema import. Still asserts each endpoint declares a 404.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(effect4): compile.test reads httpApiStatus annotation directly",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T12:21:17Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1d1198347ed6db02b040e0963acfd3c69ba76ed7",
          "body": "Phase 9. Mechanical stragglers:\n- core/stream/stream.ts: Stream.StreamTypeId -> Stream.TypeId (isStream guard).\n- list.test / mount-scoped.browser: counters.get(id)!.changes and\n  counter.value.changes are SubscriptionRefs -> SubscriptionRef.changes(...)\n  (correcting an over-eager earlier revert of\n[…]\n- core/stream/stream.test: drop .pipe(Effect.map(Chunk.toReadonlyArray))\n  (runCollect yields an array) + the unused Chunk import.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(effect4): Stream.TypeId + SubscriptionRef.changes/Chunk stragglers",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T12:17:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "23beb71b4b9dd3bb1c5daffe581801df4555ecb3",
          "body": "…le reads\n\nPhase 9. The blanket ref.changes -> SubscriptionRef.changes(ref) conversion\nmangled two Subscribable member reads (router.currentMatch.changes and\ncounter.value.changes) into X.SubscriptionRef.changes(Y). Those fields are\nSubscribables (whose .changes member is kept), so restore the member access.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(effect4): revert over-eager SubscriptionRef.changes on Subscribab…",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T12:13:48Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "675da7aaf062caaf5c7c8ebdd5e14c8576c51a96",
          "body": "Phase 9. Effect 4 made Schema.Literal single-argument; multiple literals use\nSchema.Literals([...]) (the variadic -> array change). SortValue's three sort\norders become Schema.Literals([\"price-asc\", \"price-desc\", \"name\"]), which\nalso restores the switch-case narrowing (the value type was collapsing to just\nthe first literal).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(effect4): Schema.Literal(...) -> Schema.Literals([...])",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T12:12:14Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "130e2797c0ad361e0ca6a3dba59b13ed84cc7cdc",
          "body": "…ds array)\n\nPhase 9. Effect 4 Stream.runCollect returns an array, so the trailing\nEffect.map(Chunk.toReadonlyArray) is redundant and mistyped; remove it and the\nnow-unused Chunk import. The collected changes are already the readonly array\nthe assertions expect.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(effect4): source.test drop Chunk.toReadonlyArray (runCollect yiel…",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T12:10:54Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d03c339b7ba571b3fe4d3d3148ca2813f4bd34e8",
          "body": "Phase 9. Same v4 runtime migration as router-live: Effect.runtime<never>() +\nRuntime.runFork(runtime) -> Effect.context<never>() + Effect.runForkWith(services);\ndrop the unused Runtime import. Clears the cascade requirement error too.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(effect4): link.ts runtime APIs (context/runForkWith)",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T12:09:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "27c4ce0361fe92b78838fc19458ab2dbb8ebde59",
          "body": "Phase 9. Effect 4: Stream.runCollect yields an array (not Chunk) and Fiber.poll\nis now the fiber.pollUnsafe() method.\n- Chunk.toReadonlyArray(chunks) -> chunks; Chunk.size(chunks) -> chunks.length;\n  drop the unused Chunk import.\n- Fiber.poll(fiber) -> fiber.pollUnsafe(); poll._tag === \"None\" -> poll === undefined.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(effect4): render-to-stream.test arrays + Fiber.pollUnsafe",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T12:08:21Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d565a758c68b5466e4755e97a25bede78c34bf2d",
          "body": "Phase 9. Effect 4: Stream pull/runCollect yield arrays (not Chunk), and\nCause.failures was removed.\n- Chunk.join(yield* pull, \"\") -> (yield* pull).join(\"\"); Chunk.size(collected)\n  -> collected.length; drop the now-unused Chunk import.\n- Cause.failures(c) -> c.reasons.filter(Cause.isFailReason).map((r) => r.error).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(effect4): streaming-shell.test arrays + Cause.reasons",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T12:07:08Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "09de1c66a5181cbf06376c56c57ab06634686b9c",
          "body": "Phase 9. Effect 4 logger changes:\n- Logger.replace(defaultLogger, logger) -> Logger.layer([logger]) (replaces by\n  default; still a Layer consumers provide).\n- Logger.make Options dropped ; read them from the fiber via\n  fiber.getRef(References.CurrentLogAnnotations) (a Record now, not a Map).\n- Log\n[…]\nel.Error -> the string \"Error\" (LogLevel is a string union).\n- Cause.isEmpty(cause) -> cause.reasons.length > 0 (flattened Cause).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(effect4): log-capture test helper to v4 Logger API",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T12:05:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0608e32fab9dd3eeeb5b572444a4c826be8b8401",
          "body": "Phase 9. The Layer.provide(... as any) results carry unknown error/context\nchannels, so annotate apiRoutes/rpcRoutes as Layer.Layer<any, any, any>\n(the pipeline is intentionally loosely typed — runtime-assembled).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(effect4): loosen router-server route-layer annotations",
          "author_name": "stefvw93",
          "author_login": "stefvw93",
          "committed_at": "2026-07-05T12:02:58Z",
          "body_truncated": false,
          "is_coding_agent": true
        }
      ],
      "releases_count": 45,
      "commits_last_year": 593,
      "latest_release_at": "2026-07-24T14:42:23Z",
      "latest_release_tag": "v0.31.0",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 20,
      "days_since_latest_release": 10,
      "mean_days_between_releases": 2.2
    },
    "artifacts": {
      "collected": true,
      "structure": [],
      "declarations": [
        {
          "name": null,
          "path": "package.json",
          "tokens": [
            "npm.private"
          ],
          "ecosystem": "npm"
        },
        {
          "name": "@weftui/core",
          "path": "packages/core/package.json",
          "tokens": [
            "npm.entry",
            "npm.peer_dependencies"
          ],
          "ecosystem": "npm"
        },
        {
          "name": "@weftui/dom",
          "path": "packages/dom/package.json",
          "tokens": [
            "npm.entry",
            "npm.peer_dependencies"
          ],
          "ecosystem": "npm"
        },
        {
          "name": "@weftui/router",
          "path": "packages/router/package.json",
          "tokens": [
            "npm.entry",
            "npm.peer_dependencies"
          ],
          "ecosystem": "npm"
        },
        {
          "name": "@weftui/vite",
          "path": "packages/vite/package.json",
          "tokens": [
            "npm.entry",
            "npm.peer_dependencies"
          ],
          "ecosystem": "npm"
        }
      ]
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "readme_badges": {
        "hosts": [
          "github.com"
        ],
        "total": 1,
        "header": 1,
        "collected": true,
        "has_inspect_badge": false
      },
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 57,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "website",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "scraping",
            "web"
          ],
          "ecosystem": "npm",
          "categories": [],
          "matches_repo": false,
          "registry_url": "https://www.npmjs.com/package/website",
          "declared_type": null,
          "is_deprecated": false,
          "latest_version": "0.1.1",
          "repository_url": "https://github.com/akoenig/node-website",
          "versions_count": 2,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 1677,
          "first_published_at": "2013-04-29T19:45:26.593000Z",
          "latest_published_at": "2013-05-14T20:47:23.347000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 4829
        },
        {
          "name": "@weftui/dom",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "dom",
            "effect",
            "hydration",
            "renderer",
            "ssr",
            "weft"
          ],
          "ecosystem": "npm",
          "categories": [],
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@weftui/dom",
          "declared_type": null,
          "is_deprecated": false,
          "latest_version": "0.31.0",
          "repository_url": "https://github.com/stefvw93/weft",
          "versions_count": 22,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 2088,
          "first_published_at": "2026-06-08T12:43:22.558000Z",
          "latest_published_at": "2026-07-24T14:42:19.108000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 10
        },
        {
          "name": "@weftui/core",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "combinators",
            "dom",
            "effect",
            "reactive",
            "ssr",
            "ui",
            "weft"
          ],
          "ecosystem": "npm",
          "categories": [],
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@weftui/core",
          "declared_type": null,
          "is_deprecated": false,
          "latest_version": "0.31.0",
          "repository_url": "https://github.com/stefvw93/weft",
          "versions_count": 22,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 2256,
          "first_published_at": "2026-06-08T12:43:19.571000Z",
          "latest_published_at": "2026-07-24T14:42:15.978000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 10
        },
        {
          "name": "@weftui/router",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "effect",
            "nested-routes",
            "router",
            "routing",
            "ssr",
            "weft"
          ],
          "ecosystem": "npm",
          "categories": [],
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@weftui/router",
          "declared_type": null,
          "is_deprecated": false,
          "latest_version": "0.31.0",
          "repository_url": "https://github.com/stefvw93/weft",
          "versions_count": 21,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 1895,
          "first_published_at": "2026-06-08T12:43:25.951000Z",
          "latest_published_at": "2026-07-24T14:42:22.146000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 10
        }
      ]
    },
    "popularity": {
      "forks": 1,
      "stars": 38,
      "watchers": 2,
      "fork_history": {
        "days": [
          {
            "date": "2026-07-27",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 1,
        "total_forks": 1
      },
      "star_history": null,
      "open_issues_and_prs": 27
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "demos",
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "examples/async-data-loading/tsconfig.json",
        "examples/declarative-event-handlers/tsconfig.json",
        "examples/effect-atom/tsconfig.json",
        "examples/element-ref/tsconfig.json",
        "examples/error-boundary/tsconfig.json",
        "examples/form-handling/tsconfig.json",
        "examples/headless-menu/tsconfig.json",
        "examples/keyed-list/tsconfig.json",
        "examples/list-rendering/tsconfig.json",
        "examples/reactive-styles/tsconfig.json",
        "examples/router-client/tsconfig.json",
        "examples/router-ssr/tsconfig.json",
        "examples/server-boundary/tsconfig.json",
        "examples/shared-state-islands/tsconfig.json",
        "examples/ssr-hydration/tsconfig.json",
        "examples/subscription-ref/tsconfig.json",
        "examples/suspense/tsconfig.json",
        "examples/type-augmentation/tsconfig.json",
        "packages/core/tsconfig.json",
        "packages/dom/tsconfig.json",
        "packages/router/tsconfig.json",
        "packages/vite/tsconfig.json",
        "website/tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 314907,
      "source_files_sampled": 266,
      "oversized_source_files": 3,
      "agent_instruction_files": [
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 16995
    },
    "dependencies": {
      "manifests": [
        "package.json",
        "website/package.json"
      ],
      "advisories": {
        "error": null,
        "scope": "published_package",
        "source": "osv",
        "findings": [
          {
            "name": "underscore",
            "direct": false,
            "version": "1.4.4",
            "severity": "critical",
            "ecosystem": "npm",
            "cvss_score": 9.8,
            "advisory_ids": [
              "GHSA-cf4h-3jhx-xvhq",
              "GHSA-qpx9-hpmf-5gmw"
            ],
            "fixed_version": "1.13.8",
            "advisory_count": 2,
            "oldest_advisory_days": 1915
          },
          {
            "name": "form-data",
            "direct": false,
            "version": "0.0.10",
            "severity": "high",
            "ecosystem": "npm",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-fjxv-7rqg-78g4",
              "GHSA-hmw2-7cc7-3qxx"
            ],
            "fixed_version": "4.0.6",
            "advisory_count": 2,
            "oldest_advisory_days": 378
          },
          {
            "name": "hawk",
            "direct": false,
            "version": "0.10.2",
            "severity": "high",
            "ecosystem": "npm",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-44pw-h2cw-w3vq",
              "GHSA-jcpv-g9rr-qxrc"
            ],
            "fixed_version": "9.0.1",
            "advisory_count": 2,
            "oldest_advisory_days": 2925
          },
          {
            "name": "hoek",
            "direct": false,
            "version": "0.7.6",
            "severity": "high",
            "ecosystem": "npm",
            "cvss_score": 8.8,
            "advisory_ids": [
              "GHSA-c429-5p7v-vgjp",
              "GHSA-jp4x-w63m-7wgm"
            ],
            "fixed_version": "9.0.3",
            "advisory_count": 2,
            "oldest_advisory_days": 3021
          },
          {
            "name": "http-signature",
            "direct": false,
            "version": "0.9.11",
            "severity": "high",
            "ecosystem": "npm",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-q257-vv4p-fg92"
            ],
            "fixed_version": "0.10.0",
            "advisory_count": 1,
            "oldest_advisory_days": 2824
          },
          {
            "name": "mime",
            "direct": false,
            "version": "1.2.11",
            "severity": "high",
            "ecosystem": "npm",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-wrvr-8mpx-r7pp"
            ],
            "fixed_version": "2.0.3",
            "advisory_count": 1,
            "oldest_advisory_days": 2936
          },
          {
            "name": "qs",
            "direct": false,
            "version": "0.5.6",
            "severity": "high",
            "ecosystem": "npm",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-6rw7-vpxm-498p",
              "GHSA-f9cm-p3w6-xvr3",
              "GHSA-gqgv-6jq5-jjj9",
              "GHSA-hrpp-h998-j3pp",
              "GHSA-jjv7-qpx3-h62q"
            ],
            "fixed_version": "6.14.1",
            "advisory_count": 5,
            "oldest_advisory_days": 3205
          },
          {
            "name": "request",
            "direct": true,
            "version": "2.20.0",
            "severity": "moderate",
            "ecosystem": "npm",
            "cvss_score": 6.1,
            "advisory_ids": [
              "GHSA-7xfp-9c55-5vqj",
              "GHSA-p8p7-x288-28g6"
            ],
            "fixed_version": "3.0.0",
            "advisory_count": 2,
            "oldest_advisory_days": 2824
          },
          {
            "name": "tunnel-agent",
            "direct": false,
            "version": "0.3.0",
            "severity": "moderate",
            "ecosystem": "npm",
            "cvss_score": null,
            "advisory_ids": [
              "GHSA-xc7v-wxcw-j472"
            ],
            "fixed_version": "0.6.0",
            "advisory_count": 1,
            "oldest_advisory_days": 2618
          }
        ],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {
          "high": 6,
          "critical": 1,
          "moderate": 2
        },
        "advisory_count": 18,
        "affected_count": 9,
        "assessed_count": 40,
        "malicious_count": 0,
        "assessed_package": "npm:website@0.1.1",
        "unassessed_count": 0,
        "direct_affected_count": 1
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [
        {
          "name": "@weftui/core",
          "manifest": "website/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@weftui/dom",
          "manifest": "website/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@weftui/router",
          "manifest": "website/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "effect",
          "manifest": "website/package.json",
          "ecosystem": "npm",
          "version_constraint": "catalog:"
        },
        {
          "name": "@weftui/core",
          "manifest": "packages/dom/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@weftui/core",
          "manifest": "packages/router/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@weftui/dom",
          "manifest": "packages/router/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        }
      ],
      "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": 15,
        "merged_prs": 107,
        "open_issues": 12,
        "closed_ratio": 0.2,
        "closed_issues": 3,
        "closed_unmerged_prs": 57
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "stefvw93",
          "commits": 555,
          "avatar_url": "https://avatars.githubusercontent.com/u/13518365?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci-release.yml",
        "effect-beta-bump.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "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": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "24 out of 24 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/16 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "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": 10,
            "reason": "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": 10,
            "reason": "30 commit(s) and 12 issue activity found in the last 90 days -- score normalized to 10",
            "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": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 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": "16 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "cfad421c40f74a7a3d3efa0f71caaa2cdb7d1997",
        "ran_at": "2026-08-04T07:49:26Z",
        "aggregate_score": 4.1,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": true
    },
    "contribution_flow": {
      "collected": true,
      "recent_prs": {
        "merged_7d": 0,
        "decided_7d": 0,
        "merged_30d": 14,
        "authors_30d": 1,
        "decided_30d": 14,
        "sample_size": 60,
        "window_days": 30,
        "sample_exhausted": false,
        "authors_probed_30d": 1,
        "newcomer_merged_30d": 0,
        "bot_prs_excluded_30d": 24,
        "newcomer_authors_30d": 0,
        "newcomer_decided_30d": 0
      },
      "ci_last_run_at": "2026-08-04T06:52:45Z",
      "oldest_open_prs": [
        {
          "number": 114,
          "created_at": "2026-07-02T20:28:08Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 158,
          "created_at": "2026-07-20T09:09:21Z",
          "last_comment_at": "2026-07-20T09:09:22Z",
          "last_comment_author": "dependabot"
        },
        {
          "number": 161,
          "created_at": "2026-07-20T09:10:59Z",
          "last_comment_at": "2026-07-20T09:11:00Z",
          "last_comment_author": "dependabot"
        },
        {
          "number": 162,
          "created_at": "2026-07-20T09:11:33Z",
          "last_comment_at": "2026-07-20T09:11:34Z",
          "last_comment_author": "dependabot"
        },
        {
          "number": 163,
          "created_at": "2026-07-20T14:34:29Z",
          "last_comment_at": "2026-07-20T14:34:30Z",
          "last_comment_author": "dependabot"
        },
        {
          "number": 180,
          "created_at": "2026-07-24T15:32:17Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 181,
          "created_at": "2026-07-24T16:04:18Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 183,
          "created_at": "2026-07-24T19:56:21Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 188,
          "created_at": "2026-07-27T09:11:36Z",
          "last_comment_at": "2026-07-27T09:11:37Z",
          "last_comment_author": "dependabot"
        },
        {
          "number": 189,
          "created_at": "2026-07-27T09:12:10Z",
          "last_comment_at": "2026-07-27T09:12:11Z",
          "last_comment_author": "dependabot"
        },
        {
          "number": 190,
          "created_at": "2026-08-03T09:08:33Z",
          "last_comment_at": "2026-08-03T09:08:34Z",
          "last_comment_author": "dependabot"
        },
        {
          "number": 191,
          "created_at": "2026-08-03T09:09:10Z",
          "last_comment_at": "2026-08-03T09:09:11Z",
          "last_comment_author": "dependabot"
        },
        {
          "number": 192,
          "created_at": "2026-08-03T09:09:46Z",
          "last_comment_at": "2026-08-03T09:09:46Z",
          "last_comment_author": "dependabot"
        },
        {
          "number": 193,
          "created_at": "2026-08-03T09:10:41Z",
          "last_comment_at": "2026-08-03T09:10:42Z",
          "last_comment_author": "dependabot"
        },
        {
          "number": 194,
          "created_at": "2026-08-03T09:11:16Z",
          "last_comment_at": "2026-08-03T09:11:17Z",
          "last_comment_author": "dependabot"
        }
      ],
      "last_merged_pr_at": "2026-07-24T14:39:04Z",
      "ci_last_conclusion": "FAILURE",
      "oldest_open_issues": [
        {
          "number": 168,
          "created_at": "2026-07-23T20:11:50Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 169,
          "created_at": "2026-07-23T20:11:52Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 171,
          "created_at": "2026-07-24T14:59:00Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 172,
          "created_at": "2026-07-24T14:59:02Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 173,
          "created_at": "2026-07-24T14:59:03Z",
          "last_comment_at": "2026-07-24T17:49:40Z",
          "last_comment_author": "stefvw93"
        },
        {
          "number": 174,
          "created_at": "2026-07-24T14:59:15Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 175,
          "created_at": "2026-07-24T14:59:16Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 176,
          "created_at": "2026-07-24T14:59:17Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 177,
          "created_at": "2026-07-24T14:59:26Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 178,
          "created_at": "2026-07-24T14:59:28Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 179,
          "created_at": "2026-07-24T14:59:29Z",
          "last_comment_at": "2026-07-24T19:12:51Z",
          "last_comment_author": "stefvw93"
        },
        {
          "number": 182,
          "created_at": "2026-07-24T17:49:30Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/stefvw93/weft",
    "host": "github.com",
    "name": "weft",
    "owner": "stefvw93"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "good",
      "name": "Overall health",
      "note": "The weighted overall 60 is calibrated to 65 on the published index scale (record calibration 2026-08-02).",
      "notes": [
        {
          "code": "overall_calibration",
          "params": {
            "raw": 60,
            "calibrated": 65,
            "calibration": "2026-08-02"
          }
        }
      ],
      "value": 65,
      "inputs": {
        "security": 40,
        "vitality": 87,
        "community": 46,
        "governance": 45,
        "calibration": "2026-08-02",
        "engineering": 75,
        "ai_readiness": 71,
        "weighted_overall_raw": 60
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 87,
        "weight": 0.21,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 78,
            "inputs": {
              "commits_last_year": 593,
              "human_commit_share": 0.87,
              "days_since_last_push": 0,
              "active_weeks_last_year": 20
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "20/52 weeks with commits",
                "points": 13.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 20
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "593 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 593
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 12 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "exceptional",
            "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": 45,
              "latest_release_tag": "v0.31.0",
              "releases_from_tags": false,
              "days_since_latest_release": 10,
              "mean_days_between_releases": 2.2
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "45 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 45
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 10 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 10
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~2.2 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 2.2
                    }
                  }
                ],
                "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": "exceptional",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 11,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 11 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 11
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "weak",
        "name": "Community & Adoption",
        "value": 46,
        "weight": 0.17,
        "metrics": [
          {
            "key": "popularity",
            "band": "at_risk",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 25,
            "inputs": {
              "forks": 1,
              "stars": 38,
              "watchers": 2,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "38 stars",
                "points": 25.4,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 38
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "1 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "2 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 57,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "readme_badges": 1,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "readme_badge_services": [
                "github.com"
              ],
              "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": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 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": 63,
            "inputs": {
              "packages": [
                "@weftui/dom",
                "@weftui/core",
                "@weftui/router"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 6239
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "6,239 downloads/month across npm",
                "points": 50.6,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 6239,
                      "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": "weak",
        "name": "Sustainability & Governance",
        "value": 45,
        "weight": 0.23,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 13,
            "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 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "at_risk",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Newcomer PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "newcomer_pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 32,
            "inputs": {
              "merged_prs": 107,
              "open_issues": 12,
              "closed_issues": 3,
              "prs_merged_7d": 0,
              "prs_decided_7d": 0,
              "prs_merged_30d": 14,
              "prs_decided_30d": 14,
              "issue_closed_ratio": 0.2,
              "closed_unmerged_prs": 57,
              "first_time_authors_30d": 0,
              "first_time_prs_merged_30d": 0,
              "first_time_prs_decided_30d": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "20% of issues closed",
                "points": 8.4,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 20
                    }
                  }
                ],
                "max_points": 42
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "107/164 decided PRs merged",
                "points": 19.6,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 107,
                      "decided": 164
                    }
                  }
                ],
                "max_points": 30
              },
              {
                "key": "newcomer_pr_acceptance",
                "name": "Newcomer PR acceptance",
                "detail": "no first-time contributor's PR decided in 30d",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_newcomer_prs",
                    "params": {
                      "days": 30
                    }
                  }
                ],
                "max_points": 13
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/16 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 51,
            "inputs": {
              "followers": 14,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "stefvw93",
              "public_repos": 23,
              "account_age_days": 4025
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "14 followers of stefvw93",
                "points": 8.5,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 14,
                      "login": "stefvw93"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "23 public repos, account ~11 yr old",
                "points": 22.1,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 23
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 11
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "exceptional",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "@weftui/dom",
                "@weftui/core",
                "@weftui/router"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 10
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "3 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 3,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 10 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 10
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "22 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 22
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 75,
        "weight": 0.19,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "2 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "24 out of 24 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "topics": [
                "effect-ts-community-nl",
                "effect",
                "typescript"
              ],
              "has_wiki": true,
              "homepage": null,
              "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": null,
                "points": 0,
                "status": "missed",
                "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": "3 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "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": "weak",
        "name": "Security",
        "value": 40,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "weak",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 41,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 4.1
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "24 out of 24 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/16 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "update tool detected",
                "points": 7.5,
                "status": "met",
                "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": "30 commit(s) and 12 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "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": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "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": "16 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "weak",
            "name": "Dependency advisories",
            "note": "Matched the npm:website@0.1.1 runtime dependency closure — what installing the published package pulls in — 40 packages. Reachability is not analyzed.",
            "notes": [
              {
                "code": "advisories_scope_published",
                "params": {
                  "package": "npm:website@0.1.1",
                  "assessed": 40
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 36,
            "inputs": {
              "source": "osv",
              "advisories": 18,
              "affected_packages": 9,
              "assessed_packages": 40,
              "unassessed_packages": 0,
              "affected_by_severity": "critical 1, high 6, moderate 2",
              "direct_affected_packages": 1
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "1 affected: request 2.20.0 (moderate 6.1)",
                "points": 17.9,
                "status": "partial",
                "details": [
                  {
                    "code": "advisories_affected",
                    "params": {
                      "count": 1,
                      "packages": "request 2.20.0 (moderate 6.1)"
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "8 affected: underscore 1.4.4 (critical 9.8), form-data 0.0.10 (high 7.5), hawk 0.10.2 (high 7.5), +5 more",
                "points": 2.4,
                "status": "partial",
                "details": [
                  {
                    "code": "advisories_affected",
                    "params": {
                      "count": 8,
                      "packages": "underscore 1.4.4 (critical 9.8), form-data 0.0.10 (high 7.5), hawk 0.10.2 (high 7.5)"
                    }
                  },
                  {
                    "code": "advisories_affected_more",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "9 advisory-carrying package(s) unaddressed past 90 days; oldest published 3205 days ago",
                "points": 15.2,
                "status": "partial",
                "details": [
                  {
                    "code": "advisories_stale",
                    "params": {
                      "days": 90,
                      "count": 9,
                      "oldest": 3205
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "exceptional",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 40,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "exceptional",
            "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"
              ],
              "commit_weight_rule": {
                "min_commits": 50,
                "min_commit_share": 0.1
              },
              "review_only_matches": 0,
              "below_threshold_exposures": [],
              "assessed_self_published_locations": 2
            },
            "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.04,
        "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": 16995
            },
            "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": "87 of 87 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 87,
                      "sampled": 87
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 61,
            "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": false,
              "typecheck_configs": [
                "examples/async-data-loading/tsconfig.json",
                "examples/declarative-event-handlers/tsconfig.json",
                "examples/effect-atom/tsconfig.json",
                "examples/element-ref/tsconfig.json",
                "examples/error-boundary/tsconfig.json",
                "examples/form-handling/tsconfig.json",
                "examples/headless-menu/tsconfig.json",
                "examples/keyed-list/tsconfig.json",
                "examples/list-rendering/tsconfig.json",
                "examples/reactive-styles/tsconfig.json",
                "examples/router-client/tsconfig.json",
                "examples/router-ssr/tsconfig.json",
                "examples/server-boundary/tsconfig.json",
                "examples/shared-state-islands/tsconfig.json",
                "examples/ssr-hydration/tsconfig.json",
                "examples/subscription-ref/tsconfig.json",
                "examples/suspense/tsconfig.json",
                "examples/type-augmentation/tsconfig.json",
                "packages/core/tsconfig.json",
                "packages/dom/tsconfig.json",
                "packages/router/tsconfig.json",
                "packages/vite/tsconfig.json",
                "website/tsconfig.json"
              ],
              "agent_commit_share": 0.7,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0.13
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "examples/async-data-loading/tsconfig.json, examples/declarative-event-handlers/tsconfig.json, examples/effect-atom/tsconfig.json, examples/element-ref/tsconfig.json, examples/error-boundary/tsconfig.json, examples/form-handling/tsconfig.json, examples/headless-menu/tsconfig.json, examples/keyed-list/tsconfig.json, examples/list-rendering/tsconfig.json, examples/reactive-styles/tsconfig.json, examples/router-client/tsconfig.json, examples/router-ssr/tsconfig.json, examples/server-boundary/tsconfig.json, examples/shared-state-islands/tsconfig.json, examples/ssr-hydration/tsconfig.json, examples/subscription-ref/tsconfig.json, examples/suspense/tsconfig.json, examples/type-augmentation/tsconfig.json, packages/core/tsconfig.json, packages/dom/tsconfig.json, packages/router/tsconfig.json, packages/vite/tsconfig.json, website/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples/async-data-loading/tsconfig.json, examples/declarative-event-handlers/tsconfig.json, examples/effect-atom/tsconfig.json, examples/element-ref/tsconfig.json, examples/error-boundary/tsconfig.json, examples/form-handling/tsconfig.json, examples/headless-menu/tsconfig.json, examples/keyed-list/tsconfig.json, examples/list-rendering/tsconfig.json, examples/reactive-styles/tsconfig.json, examples/router-client/tsconfig.json, examples/router-ssr/tsconfig.json, examples/server-boundary/tsconfig.json, examples/shared-state-islands/tsconfig.json, examples/ssr-hydration/tsconfig.json, examples/subscription-ref/tsconfig.json, examples/suspense/tsconfig.json, examples/type-augmentation/tsconfig.json, packages/core/tsconfig.json, packages/dom/tsconfig.json, packages/router/tsconfig.json, packages/vite/tsconfig.json, website/tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "70 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 70,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "13 of the last 100 commits are automated dependency updates",
                "points": 8,
                "status": "met",
                "details": [
                  {
                    "code": "dependency_bot_commits",
                    "params": {
                      "count": 13,
                      "sampled": 100
                    }
                  }
                ],
                "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": "exceptional",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 99,
            "inputs": {
              "primary_language": "TypeScript",
              "largest_source_bytes": 314907,
              "source_files_sampled": 266,
              "oversized_source_files": 3
            },
            "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": "3/266 source files over 60KB",
                "points": 54.4,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 266,
                      "oversized": 3
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "weak",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "demos",
                "examples"
              ],
              "has_mcp_signal": false,
              "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": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "demos, examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "demos, examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? Carries a deliberately small weight: agent tooling is a real maintenance signal, but its absence must never gate the top of the scale (calibration saturates at raw 91, so 100/100 remains reachable with AI Readiness at zero)."
      }
    ],
    "classification": {
      "top": [
        "library"
      ],
      "labels": [
        "library"
      ],
      "scores": {
        "library": 8.6
      },
      "primary": "library",
      "evidence": [
        {
          "tier": "declared",
          "label": "library",
          "source": "npm.private",
          "weight": -6
        },
        {
          "tier": "distribution",
          "label": "library",
          "source": "registry:npm",
          "weight": 6
        },
        {
          "tier": "declared",
          "label": "library",
          "source": "npm.entry",
          "weight": 4.8
        },
        {
          "tier": "description",
          "label": "library",
          "source": "description:library",
          "weight": 2
        },
        {
          "tier": "declared",
          "label": "library",
          "source": "npm.peer_dependencies",
          "weight": 1.8
        }
      ],
      "artifacts": [
        {
          "path": "package.json",
          "labels": [],
          "ecosystem": "npm"
        },
        {
          "path": "packages/core/package.json",
          "labels": [
            "library"
          ],
          "ecosystem": "npm"
        },
        {
          "path": "packages/dom/package.json",
          "labels": [
            "library"
          ],
          "ecosystem": "npm"
        },
        {
          "path": "packages/router/package.json",
          "labels": [
            "library"
          ],
          "ecosystem": "npm"
        },
        {
          "path": "packages/vite/package.json",
          "labels": [
            "library"
          ],
          "ecosystem": "npm"
        }
      ],
      "confidence": "high",
      "host_extension": false,
      "runs_as_process": false,
      "consumed_by_code": true
    },
    "metrics_version": "2.5.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "npm package 'website' points at a different repository (https://github.com/akoenig/node-website); excluded from ecosystem scoring",
    "Could not fetch npm package '@weftui/vite' from its registry",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-08-04T07:49:41.718858Z",
  "schema_version": "0.30.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/s/stefvw93/weft.svg",
  "full_name": "stefvw93/weft",
  "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 v2.5.0, schema v0.30.0 — full methodology · metrics wiki.

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