Public record
Software health reportschema 0.26.0 · metrics 1.13.0 · 2026-07-22 18:14 UTC

e0ipso / strikethroo

Task management for AI coding assistants

JavaScript · TypeScriptMIT★ 43 stars⑂ 3 forkssince Sep 2025View on GitHub ↗

e0ipso/strikethroo holds a health index of 69 out of 100, placing it in the Moderate band. It scores highest on Vitality (93/100) and lowest on Community & Adoption (43/100). It was last updated 5 days ago. A single contributor accounts for most of its recent work.

69
overall / 100
Moderate

Software health index

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

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

Score profile

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

Ownership

Mateu Aguiló BoschPersonal account
156 followers109 public repossince Oct 2011Lullabot

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
npmstrikethroo3.14.32,109245 days agoclitask-managementainpxtypescript

Metrics by category

Vitality

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

93Excellent · 22% of overall
How it's scored
36/36Push recency — last push 5 days ago
23.5/36Commit cadence — 34/52 weeks with commits
18/18Commit volume — 629 commits in the last year
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 22 issue activity found in the last 90 days -- score normalized to 10
Inputs used
commits_last_year629
human_commit_share1
days_since_last_push5
active_weeks_last_year34

Release discipline

100Excellent
How it's scored
27/27Ships releases — 100 releases published
36/36Release recency — latest release 5 days ago
27/27Release cadence — a release every ~1 days
0/10OpenSSF Scorecard: Signed-Releases — no data
Inputs used
releases_count100
latest_release_tagv3.14.3
releases_from_tagsno
days_since_latest_release5
mean_days_between_releases1
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?

43At risk · 18% of overall
How it's scored
26.3/60Stars — 43 stars
2.5/25Forks — 3 forks
0/15Watchers — 0 watchers
Inputs used
forks3
stars43
watchers0
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
0/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
How it's scored
44.3/80Monthly downloads — 2,109 downloads/month across npm
0/20Registry dependents — not reported by this ecosystem
Inputs used
packagesstrikethroo
dependents
ecosystemsnpm
total_downloads
monthly_downloads2,109
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?

64Moderate · 24% of overall
How it's scored
9/54Bus factor — 1 contributor(s) cover half of all commits
6/22.5Commit distribution — top contributor authored 73% of commits
5.4/13.5Contributor breadth — 4 contributors
10/10OpenSSF Scorecard: Contributors — project has 9 contributing companies or organizations
Inputs used
bus_factor1
contributors_sampled4
top_contributor_share0.734
How it's scored
37.1/46.8Issue resolution — 79% of issues closed
38.2/38.3PR acceptance — 35/35 decided PRs merged
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Inputs used
merged_prs35
open_issues6
closed_issues23
issue_closed_ratio0.793
closed_unmerged_prs0
How it's scored
10/30Ownership backing — personal (user) account
0/20Verified domain — not applicable to user accounts
15.8/25Owner reach — 156 followers of e0ipso
25/25Track record — 109 public repos, account ~14 yr old
Inputs used
followers156
owner_typeUser
is_verified
owner_logine0ipso
public_repos109
account_age_days5,389
Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.
How it's scored
25/25Published & resolvable — 1 package(s) on npm
35/35Publish recency — latest publish 5 days ago
20/20Version history — 24 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packagesstrikethroo
ecosystemsnpm
any_deprecatedno
min_days_since_publish5

Engineering Quality

Are baseline engineering and documentation practices in place?

85Excellent · 20% of overall
How it's scored
24/24CI workflows — 3 workflow(s)
24/24Tests present
16/16Linter config — .eslintrc.js, eslint.config.mjs
0/9.6Pre-commit hooks
0/6.4.editorconfig
18/20OpenSSF Scorecard: CI-Tests — 11 out of 12 merged PRs checked by a CI test -- score normalized to 9
Inputs used
has_ciyes
has_testsyes
has_editorconfigno
has_linter_configyes
has_precommit_configno

Documentation

90Excellent
How it's scored
30/30README
25/25Documentation directory
15/15Documentation / homepage site — https://strikethroo.canpicasoft.com
10/10Repository description
10/10Topics — 8 topics
0/10Wiki
Inputs used
topicsagents, ai, claude-code, code-generation, codex, coding-assistant, gemini-cli, opencode
has_wikino
homepagehttps://strikethroo.canpicasoft.com
has_readmeyes
has_docs_diryes
has_descriptionyes

Security

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

51Moderate · 16% of overall
How it's scored
7.5/7.5Binary-Artifacts — no binaries found in the repo
2.2/7.5Branch-Protection — branch protection is not maximal on development and all release branches
2.2/2.5CI-Tests — 11 out of 12 merged PRs checked by a CI test -- score normalized to 9
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
2.5/2.5Contributors — project has 9 contributing companies or organizations
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 22 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
0.5/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 1
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
2/5Security-Policy — security policy file detected
0/7.5Signed-Releases — no data
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 65 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate5.1
Excluded from scoring (no data or not applicable): signed_releases. Remaining weights renormalized.

AI Readiness

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

73Good · 0% of overall
How it's scored
45/45Agent instructions — AGENTS.md, CLAUDE.md
0/15Machine-readable docs (llms.txt)
40/40Legible commit history — 99 of 100 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share0.99
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes28,853
How it's scored
0/18One-command bootstrap
22/22Automated tests
11/11Lint / format config — .eslintrc.js, eslint.config.mjs
11/11Static type checking — tsconfig.json
10/10Reproducible environment — devcontainer, lockfile
2/10Demonstrated agent practice — 1 of the last 100 commits agent-authored or agent-credited
5/8Automated maintenance — dependency automation configured, none observed in the sampled commits
1/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 1
Inputs used
has_nixno
has_testsyes
lockfilespackage-lock.json
has_dockerfileno
typed_languageno
bootstrap_files
has_devcontaineryes
has_linter_configyes
typecheck_configstsconfig.json
agent_commit_share0.01
toolchain_manifests
dependency_bot_commit_share0
How it's scored
27/45Type-checkable code — JavaScript with type-check config (tsconfig.json)
53.4/55Manageable file sizes — 5/168 source files over 60KB
Inputs used
primary_languageJavaScript
largest_source_bytes242,435
source_files_sampled168
oversized_source_files5

Key facts

43GitHub stars
4contributors
629commits, last 12 months
5days since last push
100releases
1bus factor
6open issues
npm, RubyGemspackage ecosystems

Data collection warnings

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

More detail

Star and fork history 0 ★ / 3 ⇿
0Stars
3Forks
25Releases

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

12233312026-032026-052026-07
Major 1Minor 16Patch 8
OpenSSF Scorecard 5.1 / 10
5.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-07-22 18:14 UTC

10Binary-Artifactsno binaries found in the repo
3Branch-Protectionbranch protection is not maximal on development and all release branches
9CI-Tests11 out of 12 merged PRs checked by a CI test -- score normalized to 9
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
10Contributorsproject has 9 contributing companies or organizations
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 22 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
1Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 1
0SASTSAST tool is not run on all commits -- score normalized to 0
4Security-Policysecurity policy file detected
n/aSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities65 existing vulnerabilities detected
Direct dependencies 6
RegistryPackageVersion constraintManifest
npmchalk^5.6.0package.json
npmcommander^11.1.0package.json
npmdiff^5.2.0package.json
npmfs-extra^11.3.1package.json
npmgray-matter^4.0.3package.json
npminquirer^9.3.8package.json
All dependencies not collected

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

Raw JSON report machine-readable
{
  "data": {
    "repo": {
      "topics": [
        "agents",
        "ai",
        "claude-code",
        "code-generation",
        "codex",
        "coding-assistant",
        "gemini-cli",
        "opencode"
      ],
      "is_fork": false,
      "size_kb": 50278,
      "has_wiki": false,
      "homepage": "https://strikethroo.canpicasoft.com",
      "languages": {
        "HTML": 1278,
        "Shell": 2654,
        "JavaScript": 1201444,
        "TypeScript": 751581
      },
      "pushed_at": "2026-07-17T14:24:10Z",
      "created_at": "2025-09-02T08:25:45Z",
      "owner_type": "User",
      "updated_at": "2026-07-17T13:40:08Z",
      "description": "Task management for AI coding assistants",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "JavaScript",
      "significant_languages": [
        "JavaScript",
        "TypeScript"
      ]
    },
    "owner": {
      "blog": "http://about.me/e0ipso",
      "name": "Mateu Aguiló Bosch",
      "type": "User",
      "login": "e0ipso",
      "company": "Lullabot",
      "location": "Ca'n Picafort, Mallorca, Spain",
      "followers": 156,
      "avatar_url": "https://avatars.githubusercontent.com/u/1140906?v=4",
      "created_at": "2011-10-20T14:27:43Z",
      "is_verified": null,
      "public_repos": 109,
      "account_age_days": 5389
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v3.14.3",
          "kind": "patch",
          "published_at": "2026-07-17T13:39:42Z"
        },
        {
          "tag": "v3.14.2",
          "kind": "patch",
          "published_at": "2026-07-17T11:22:00Z"
        },
        {
          "tag": "v3.14.1",
          "kind": "patch",
          "published_at": "2026-07-17T11:19:58Z"
        },
        {
          "tag": "v3.14.0",
          "kind": "minor",
          "published_at": "2026-07-14T22:18:24Z"
        },
        {
          "tag": "v3.13.0",
          "kind": "minor",
          "published_at": "2026-07-14T16:28:08Z"
        },
        {
          "tag": "v3.12.0",
          "kind": "minor",
          "published_at": "2026-07-12T21:27:25Z"
        },
        {
          "tag": "v3.11.0",
          "kind": "minor",
          "published_at": "2026-07-12T20:20:01Z"
        },
        {
          "tag": "v3.10.0",
          "kind": "minor",
          "published_at": "2026-07-11T22:32:48Z"
        },
        {
          "tag": "v3.9.0",
          "kind": "minor",
          "published_at": "2026-07-08T16:43:39Z"
        },
        {
          "tag": "v3.8.0",
          "kind": "minor",
          "published_at": "2026-07-08T06:43:07Z"
        },
        {
          "tag": "v3.7.0",
          "kind": "minor",
          "published_at": "2026-07-03T13:47:07Z"
        },
        {
          "tag": "v3.6.1",
          "kind": "patch",
          "published_at": "2026-06-29T12:18:57Z"
        },
        {
          "tag": "v3.6.0",
          "kind": "minor",
          "published_at": "2026-06-22T04:55:08Z"
        },
        {
          "tag": "v3.5.0",
          "kind": "minor",
          "published_at": "2026-06-21T15:38:17Z"
        },
        {
          "tag": "v3.4.2",
          "kind": "patch",
          "published_at": "2026-06-17T15:23:08Z"
        },
        {
          "tag": "v3.4.1",
          "kind": "patch",
          "published_at": "2026-06-17T14:42:17Z"
        },
        {
          "tag": "v3.4.0",
          "kind": "minor",
          "published_at": "2026-06-03T07:40:23Z"
        },
        {
          "tag": "v3.3.1",
          "kind": "patch",
          "published_at": "2026-06-02T19:27:11Z"
        },
        {
          "tag": "v3.3.0",
          "kind": "minor",
          "published_at": "2026-06-02T13:46:17Z"
        },
        {
          "tag": "v3.2.0",
          "kind": "minor",
          "published_at": "2026-06-01T21:22:48Z"
        },
        {
          "tag": "v3.1.0",
          "kind": "minor",
          "published_at": "2026-06-01T20:19:07Z"
        },
        {
          "tag": "v3.0.2",
          "kind": "patch",
          "published_at": "2026-05-28T21:15:22Z"
        },
        {
          "tag": "v3.0.1",
          "kind": "patch",
          "published_at": "2026-05-28T20:52:32Z"
        },
        {
          "tag": "v3.0.0",
          "kind": "major",
          "published_at": "2026-05-28T20:52:01Z"
        },
        {
          "tag": "v2.2.0",
          "kind": "minor",
          "published_at": "2026-05-26T13:13:39Z"
        },
        {
          "tag": "v2.1.0",
          "kind": "minor",
          "published_at": "2026-05-25T21:44:51Z"
        },
        {
          "tag": "v1.39.1",
          "kind": "patch",
          "published_at": "2026-05-25T19:51:30Z"
        },
        {
          "tag": "v1.39.0",
          "kind": "minor",
          "published_at": "2026-05-25T15:55:06Z"
        },
        {
          "tag": "v1.38.0",
          "kind": "minor",
          "published_at": "2026-05-25T15:41:06Z"
        },
        {
          "tag": "v1.37.0",
          "kind": "minor",
          "published_at": "2026-05-25T15:34:38Z"
        },
        {
          "tag": "v1.36.1",
          "kind": "patch",
          "published_at": "2026-05-13T21:59:24Z"
        },
        {
          "tag": "v1.36.0",
          "kind": "minor",
          "published_at": "2026-04-21T08:28:19Z"
        },
        {
          "tag": "v1.35.0",
          "kind": "minor",
          "published_at": "2026-04-15T20:20:02Z"
        },
        {
          "tag": "v1.34.0",
          "kind": "minor",
          "published_at": "2026-03-27T06:18:21Z"
        },
        {
          "tag": "v1.33.0",
          "kind": "minor",
          "published_at": "2026-03-26T10:29:32Z"
        },
        {
          "tag": "v1.32.0",
          "kind": "minor",
          "published_at": "2026-03-09T14:08:44Z"
        },
        {
          "tag": "v1.31.0",
          "kind": "minor",
          "published_at": "2026-03-09T09:16:45Z"
        },
        {
          "tag": "v1.30.1",
          "kind": "patch",
          "published_at": "2026-03-06T21:30:03Z"
        },
        {
          "tag": "v1.30.0",
          "kind": "minor",
          "published_at": "2026-03-06T18:21:55Z"
        },
        {
          "tag": "v1.29.0",
          "kind": "minor",
          "published_at": "2026-03-06T18:10:50Z"
        },
        {
          "tag": "v1.28.0",
          "kind": "minor",
          "published_at": "2026-03-06T15:55:36Z"
        },
        {
          "tag": "v1.27.2",
          "kind": "patch",
          "published_at": "2026-02-27T08:07:12Z"
        },
        {
          "tag": "v1.27.1",
          "kind": "patch",
          "published_at": "2026-02-27T07:51:46Z"
        },
        {
          "tag": "v1.27.0",
          "kind": "minor",
          "published_at": "2026-02-02T10:13:48Z"
        },
        {
          "tag": "v1.26.11",
          "kind": "patch",
          "published_at": "2026-01-30T16:04:30Z"
        },
        {
          "tag": "v1.26.10",
          "kind": "patch",
          "published_at": "2026-01-30T15:54:56Z"
        },
        {
          "tag": "v1.26.9",
          "kind": "patch",
          "published_at": "2026-01-26T10:16:42Z"
        },
        {
          "tag": "v1.26.8",
          "kind": "patch",
          "published_at": "2026-01-21T11:05:39Z"
        },
        {
          "tag": "v1.26.7",
          "kind": "patch",
          "published_at": "2026-01-21T06:40:34Z"
        },
        {
          "tag": "v1.26.6",
          "kind": "patch",
          "published_at": "2026-01-09T10:57:31Z"
        },
        {
          "tag": "v1.26.5",
          "kind": "patch",
          "published_at": "2026-01-09T10:40:16Z"
        },
        {
          "tag": "v1.26.4",
          "kind": "patch",
          "published_at": "2026-01-08T21:28:32Z"
        },
        {
          "tag": "v1.26.3",
          "kind": "patch",
          "published_at": "2026-01-06T07:07:00Z"
        },
        {
          "tag": "v1.26.2",
          "kind": "patch",
          "published_at": "2026-01-04T08:24:53Z"
        },
        {
          "tag": "v1.26.1",
          "kind": "patch",
          "published_at": "2026-01-03T06:15:59Z"
        },
        {
          "tag": "v1.26.0",
          "kind": "minor",
          "published_at": "2025-12-03T09:48:50Z"
        },
        {
          "tag": "v1.25.0",
          "kind": "minor",
          "published_at": "2025-12-01T10:04:21Z"
        },
        {
          "tag": "v1.24.0",
          "kind": "minor",
          "published_at": "2025-11-23T09:19:18Z"
        },
        {
          "tag": "v1.23.1",
          "kind": "patch",
          "published_at": "2025-11-23T07:41:24Z"
        },
        {
          "tag": "v1.23.0",
          "kind": "minor",
          "published_at": "2025-11-23T06:42:52Z"
        },
        {
          "tag": "v1.22.0",
          "kind": "minor",
          "published_at": "2025-11-22T18:13:41Z"
        },
        {
          "tag": "v1.21.0",
          "kind": "minor",
          "published_at": "2025-11-22T08:04:23Z"
        },
        {
          "tag": "v1.20.0",
          "kind": "minor",
          "published_at": "2025-11-05T10:08:13Z"
        },
        {
          "tag": "v1.19.0",
          "kind": "minor",
          "published_at": "2025-10-30T22:55:22Z"
        },
        {
          "tag": "v1.18.7",
          "kind": "patch",
          "published_at": "2025-10-28T12:10:28Z"
        },
        {
          "tag": "v1.18.6",
          "kind": "patch",
          "published_at": "2025-10-22T08:09:32Z"
        },
        {
          "tag": "v1.18.5",
          "kind": "patch",
          "published_at": "2025-10-20T05:55:34Z"
        },
        {
          "tag": "v1.18.4",
          "kind": "patch",
          "published_at": "2025-10-20T05:00:23Z"
        },
        {
          "tag": "v1.18.3",
          "kind": "patch",
          "published_at": "2025-10-17T21:15:29Z"
        },
        {
          "tag": "v1.18.2",
          "kind": "patch",
          "published_at": "2025-10-17T13:18:57Z"
        },
        {
          "tag": "v1.18.1",
          "kind": "patch",
          "published_at": "2025-10-17T09:41:47Z"
        },
        {
          "tag": "v1.18.0",
          "kind": "minor",
          "published_at": "2025-10-17T08:42:16Z"
        },
        {
          "tag": "v1.17.1",
          "kind": "patch",
          "published_at": "2025-10-17T08:17:05Z"
        },
        {
          "tag": "v1.17.0",
          "kind": "minor",
          "published_at": "2025-10-16T23:02:35Z"
        },
        {
          "tag": "v1.16.0",
          "kind": "minor",
          "published_at": "2025-10-16T22:33:56Z"
        },
        {
          "tag": "v1.15.0",
          "kind": "minor",
          "published_at": "2025-10-16T09:38:50Z"
        },
        {
          "tag": "v1.14.0",
          "kind": "minor",
          "published_at": "2025-10-16T08:16:25Z"
        },
        {
          "tag": "v1.13.0",
          "kind": "minor",
          "published_at": "2025-10-09T10:47:02Z"
        },
        {
          "tag": "v1.12.0",
          "kind": "minor",
          "published_at": "2025-10-09T05:48:28Z"
        },
        {
          "tag": "v1.11.1",
          "kind": "patch",
          "published_at": "2025-10-03T21:55:19Z"
        },
        {
          "tag": "v1.11.0",
          "kind": "minor",
          "published_at": "2025-09-27T21:10:10Z"
        },
        {
          "tag": "v1.10.0",
          "kind": "minor",
          "published_at": "2025-09-27T20:09:17Z"
        },
        {
          "tag": "v1.9.2",
          "kind": "patch",
          "published_at": "2025-09-26T14:58:23Z"
        },
        {
          "tag": "v1.9.1",
          "kind": "patch",
          "published_at": "2025-09-25T10:52:59Z"
        },
        {
          "tag": "v1.9.0",
          "kind": "minor",
          "published_at": "2025-09-25T10:13:58Z"
        },
        {
          "tag": "v1.8.3",
          "kind": "patch",
          "published_at": "2025-09-23T11:30:58Z"
        },
        {
          "tag": "v1.8.2",
          "kind": "patch",
          "published_at": "2025-09-17T16:30:43Z"
        },
        {
          "tag": "v1.8.1",
          "kind": "patch",
          "published_at": "2025-09-15T10:23:21Z"
        },
        {
          "tag": "v1.8.0",
          "kind": "minor",
          "published_at": "2025-09-15T09:43:46Z"
        },
        {
          "tag": "v1.7.1",
          "kind": "patch",
          "published_at": "2025-09-15T09:37:40Z"
        },
        {
          "tag": "v1.7.0",
          "kind": "minor",
          "published_at": "2025-09-15T09:36:52Z"
        },
        {
          "tag": "v1.6.2",
          "kind": "patch",
          "published_at": "2025-09-15T09:34:52Z"
        },
        {
          "tag": "v1.6.1",
          "kind": "patch",
          "published_at": "2025-09-15T09:31:23Z"
        },
        {
          "tag": "v1.6.0",
          "kind": "minor",
          "published_at": "2025-09-10T10:28:51Z"
        },
        {
          "tag": "v1.5.0",
          "kind": "minor",
          "published_at": "2025-09-08T11:12:58Z"
        },
        {
          "tag": "v1.4.0",
          "kind": "minor",
          "published_at": "2025-09-08T10:22:23Z"
        },
        {
          "tag": "v1.3.0",
          "kind": "minor",
          "published_at": "2025-09-08T08:55:03Z"
        },
        {
          "tag": "v1.2.1",
          "kind": "patch",
          "published_at": "2025-09-06T07:12:22Z"
        },
        {
          "tag": "v1.2.0",
          "kind": "minor",
          "published_at": "2025-09-04T07:44:33Z"
        },
        {
          "tag": "v1.1.4",
          "kind": "patch",
          "published_at": "2025-09-03T10:43:40Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "96cea9ed5045a8da35165c4ba0d875e8f12cd6df",
          "body": "## <small>3.14.3 (2026-07-17)</small>\n\n* fix: allow workspace-only branch creation (#65) ([543f5bd](https://github.com/e0ipso/strikethroo/commit/543f5bd)), closes [#65](https://github.com/e0ipso/strikethroo/issues/65) [#63](https://github.com/e0ipso/strikethroo/issues/63)",
          "is_bot": false,
          "headline": "chore(release): 3.14.3 [skip ci]",
          "author_name": "semantic-release-bot",
          "author_login": "semantic-release-bot",
          "committed_at": "2026-07-17T13:39:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "543f5bd5c9e05445c5bc9e1f960360e98005dc44",
          "body": "## Summary\n\n- Allow `create-feature-branch` to proceed from `main` or `master` when\nevery staged, unstaged, or untracked change is confined to the\nrepository-root `.ai/strikethroo` workspace.\n- Preserve the hard safety gate for every change outside that workspace.\n- Fail closed when Git status inspe\n[…]\ne: **37 passed**\n\nGenerated CommonJS skill bundles were rebuilt and verified locally but\nare intentionally excluded from ordinary commits; the release workflow\nrebuilds and force-adds them.\n\nFixes #63",
          "is_bot": false,
          "headline": "fix: allow workspace-only branch creation (#65)",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-07-17T13:37:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ab8d7715c527534da3d0ec97ed8a53f0876ac68c",
          "body": "## <small>3.14.2 (2026-07-17)</small>\n\n* fix: delete leftover files ([61bb1f9](https://github.com/e0ipso/strikethroo/commit/61bb1f9))",
          "is_bot": false,
          "headline": "chore(release): 3.14.2 [skip ci]",
          "author_name": "semantic-release-bot",
          "author_login": "semantic-release-bot",
          "committed_at": "2026-07-17T11:21:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "61bb1f9e06ab3db75315e8f0d18122b1ef805062",
          "body": null,
          "is_bot": false,
          "headline": "fix: delete leftover files",
          "author_name": "e0ipso",
          "author_login": "e0ipso",
          "committed_at": "2026-07-17T11:19:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1a8c52739c4369e264dd9121e62749fec590ec02",
          "body": "## <small>3.14.1 (2026-07-17)</small>\n\n* fix: probe harness availability with default model (#64) ([1aa98a1](https://github.com/e0ipso/strikethroo/commit/1aa98a1)), closes [#64](https://github.com/e0ipso/strikethroo/issues/64) [#62](https://github.com/e0ipso/strikethroo/issues/62)\n* chore: update gitignore ([fbfdd99](https://github.com/e0ipso/strikethroo/commit/fbfdd99))",
          "is_bot": false,
          "headline": "chore(release): 3.14.1 [skip ci]",
          "author_name": "semantic-release-bot",
          "author_login": "semantic-release-bot",
          "committed_at": "2026-07-17T11:19:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1aa98a1f75f3c751b7f91803942407247642035c",
          "body": "Availability probes hard-coded a pinned probe model per harness and\npassed it via --model. A retired pinned model marked a working,\nauthenticated harness unavailable, caching a false negative that made\nrouting avoid or fall back from an otherwise usable harness.\n\nRemove the model field from HarnessA\n[…]\ny probe command and\ncover each harness's exact non-interactive command. Docs state probes\nuse each harness's default model.\n\nFixes #62\n\nCo-authored-by: e0ipso <1140906+e0ipso@users.noreply.github.com>",
          "is_bot": false,
          "headline": "fix: probe harness availability with default model (#64)",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-07-17T11:18:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fbfdd99b4ffc83e9589f351c49329728f3a9182a",
          "body": null,
          "is_bot": false,
          "headline": "chore: update gitignore",
          "author_name": "e0ipso",
          "author_login": "e0ipso",
          "committed_at": "2026-07-14T22:20:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c9658e5c2c48f47470d5960a6348df24ffafcec4",
          "body": "## 3.14.0 (2026-07-14)\n\n* feat: route targets at task dispatch (#59) ([72104d3](https://github.com/e0ipso/strikethroo/commit/72104d3)), closes [#59](https://github.com/e0ipso/strikethroo/issues/59) [#60](https://github.com/e0ipso/strikethroo/issues/60)",
          "is_bot": false,
          "headline": "chore(release): 3.14.0 [skip ci]",
          "author_name": "semantic-release-bot",
          "author_login": "semantic-release-bot",
          "committed_at": "2026-07-14T22:17:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "72104d3b3d07ef46014e539fce39c3a59ba50636",
          "body": "Persist execution profiles during generation.\n\nSelect exact targets at dispatch.\n\nAdd probes, caching, retries, and native fallback.\n\nAlign the UI, fixtures, skills, and docs.\n\nCloses #60\n\nCo-authored-by: e0ipso <1140906+e0ipso@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat: route targets at task dispatch (#59)",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-07-14T22:16:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e11020fb853353a23e2775fbfc75756653bd2f04",
          "body": "## 3.13.0 (2026-07-14)\n\n* feat: randomize available execution targets (#57) ([63b3677](https://github.com/e0ipso/strikethroo/commit/63b3677)), closes [#57](https://github.com/e0ipso/strikethroo/issues/57) [#58](https://github.com/e0ipso/strikethroo/issues/58)",
          "is_bot": false,
          "headline": "chore(release): 3.13.0 [skip ci]",
          "author_name": "semantic-release-bot",
          "author_login": "semantic-release-bot",
          "committed_at": "2026-07-14T16:27:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "63b367793cd2d01a78d584b587d3a12b680d239b",
          "body": "Filter external execution targets by installed harness CLI and choose\nuniformly among the available candidates. Preserve first-target fallback\nand custom resolver behavior.\n\nFix routing target field widths and attach generated devcontainers to a\nworkspace-specific Docker network.\n\nCloses #58\n\n---------\n\nCo-authored-by: e0ipso <1140906+e0ipso@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat: randomize available execution targets (#57)",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-07-14T16:26:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6296088e93e2747ec066f154df89cf448130ab38",
          "body": "## 3.12.0 (2026-07-12)\n\n* feat: automate task execution routing during generation (#55) ([4cfb813](https://github.com/e0ipso/strikethroo/commit/4cfb813)), closes [#55](https://github.com/e0ipso/strikethroo/issues/55) [#53-compatible](https://github.com/e0ipso/strikethroo/issues/53-compatible) [#53](https://github.com/e0ipso/strikethroo/issues/53)",
          "is_bot": false,
          "headline": "chore(release): 3.12.0 [skip ci]",
          "author_name": "semantic-release-bot",
          "author_login": "semantic-release-bot",
          "committed_at": "2026-07-12T21:26:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4cfb813833190d8c0654d8fc8bd90139061000a3",
          "body": "Task generation now classifies every generated task into a configured\nexecution profile and writes PR #53-compatible exact execution\nfrontmatter deterministically. Closes #54.\n\n- New workspace config config/execution-routing.yaml (ships disabled\n  with profiles: {}), copied and hash-tracked by init;\n[…]\n real claude binary on\n  the host PATH.\n- Docs (customization, workflow, glossary, AGENTS.md), Customize hook\n  description, serve/capture fixtures, and unit/integration/prompt/\n  init-tracking tests.",
          "is_bot": false,
          "headline": "feat: automate task execution routing during generation (#55)",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-07-12T21:25:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e9b749e9a542427d40bcc6331ee052957de40e0c",
          "body": "## 3.11.0 (2026-07-12)\n\n* feat: introduce manifest-driven harness adapter registry (#56) ([08eb81c](https://github.com/e0ipso/strikethroo/commit/08eb81c)), closes [#56](https://github.com/e0ipso/strikethroo/issues/56) [#30](https://github.com/e0ipso/strikethroo/issues/30)",
          "is_bot": false,
          "headline": "chore(release): 3.11.0 [skip ci]",
          "author_name": "semantic-release-bot",
          "author_login": "semantic-release-bot",
          "committed_at": "2026-07-12T20:19:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "08eb81ca36f8313ade98ac7a42b58562ac8dc79b",
          "body": "Extract the per-harness init logic that lived inline in src/index.ts\ninto a\nsmall adapter registry under src/harnesses/. Each supported harness is\nnow a\nHarnessAdapter that declares how it is detected, installed, and updated,\nand\ninit iterates HarnessRegistry instead of branching over harnesses.\n\nBe\n[…]\nhe existing init\nintegration suite\npasses unmodified. detect() and update() are provided for interface\ncompleteness; init behavior is unchanged (detect is not wired into its\ncontrol\nflow).\n\nCloses #30",
          "is_bot": false,
          "headline": "feat: introduce manifest-driven harness adapter registry (#56)",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-07-12T20:17:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0381fa0b8494ff4ebe9c2112114cdca2616bf981",
          "body": "## 3.10.0 (2026-07-11)\n\n* feat: add task execution overrides (#53) ([b1231fa](https://github.com/e0ipso/strikethroo/commit/b1231fa)), closes [#53](https://github.com/e0ipso/strikethroo/issues/53)",
          "is_bot": false,
          "headline": "chore(release): 3.10.0 [skip ci]",
          "author_name": "semantic-release-bot",
          "author_login": "semantic-release-bot",
          "committed_at": "2026-07-11T22:32:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b1231fa0b34c8f945dd7e376928594a4ec9bef6e",
          "body": "## Summary\n- replace the `github` harness identifier with `copilot` and generate\nCopilot custom agents at `.github/agents/*.md`\n- add task-only `execution` frontmatter parsing, including exact model\npass-through and lossless status rewriting\n- add a bundled external-dispatch runtime for Claude, Code\n[…]\nion\n- `npm run build`\n- `npm test` — 232 unit tests and 36 Playwright tests passed\n- Playwright also passed with `--workers=2`, used as the stable retry\nafter one default-worker CPU-contention timeout",
          "is_bot": false,
          "headline": "feat: add task execution overrides (#53)",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-07-11T22:30:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d1a7d7c196fc93a29bdb24b9919fa1b3ddb80745",
          "body": "## 3.9.0 (2026-07-08)\n\n* feat: split skill scripts validation helpers (#48) ([9f619f4](https://github.com/e0ipso/strikethroo/commit/9f619f4)), closes [#48](https://github.com/e0ipso/strikethroo/issues/48) [#47](https://github.com/e0ipso/strikethroo/issues/47)\n* docs: update kenkeep docs ([1dfd261](https://github.com/e0ipso/strikethroo/commit/1dfd261))",
          "is_bot": false,
          "headline": "chore(release): 3.9.0 [skip ci]",
          "author_name": "semantic-release-bot",
          "author_login": "semantic-release-bot",
          "committed_at": "2026-07-08T16:43:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9f619f42e14e31fcfd9536f175e76d230e3feecb",
          "body": "Closes #47",
          "is_bot": false,
          "headline": "feat: split skill scripts validation helpers (#48)",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-07-08T16:41:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1dfd2615347b3bb4c136eb21cfa08d38ca83dfbe",
          "body": null,
          "is_bot": false,
          "headline": "docs: update kenkeep docs",
          "author_name": "e0ipso",
          "author_login": "e0ipso",
          "committed_at": "2026-07-08T15:14:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "29b7056940f5c730cfb65ddd61b2351b00f62c5c",
          "body": "## 3.8.0 (2026-07-08)\n\n* feat: require complexity score in task documents (#46) ([1c58a84](https://github.com/e0ipso/strikethroo/commit/1c58a84)), closes [#46](https://github.com/e0ipso/strikethroo/issues/46)\n* docs: remove Pages CNAME artifact (#44) ([b3f9dcb](https://github.com/e0ipso/strikethroo/\n[…]\n/issues/43)\n* docs: update kenkeep ([44f69ef](https://github.com/e0ipso/strikethroo/commit/44f69ef))\n* chore: ignore devcontainer lock ([6035ecf](https://github.com/e0ipso/strikethroo/commit/6035ecf))",
          "is_bot": false,
          "headline": "chore(release): 3.8.0 [skip ci]",
          "author_name": "semantic-release-bot",
          "author_login": "semantic-release-bot",
          "committed_at": "2026-07-08T06:42:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1c58a845400d0324f47ae8513664feb27ecc5626",
          "body": null,
          "is_bot": false,
          "headline": "feat: require complexity score in task documents (#46)",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-07-08T06:41:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "44f69ef4174b4fc98d1591762ee8962672fa7d43",
          "body": null,
          "is_bot": false,
          "headline": "docs: update kenkeep",
          "author_name": "e0ipso",
          "author_login": "e0ipso",
          "committed_at": "2026-07-04T09:01:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b3f9dcb4632a365b5c4b6750f582aab4c312d6ba",
          "body": "## Summary\n- remove docs/CNAME from the Actions-built Pages artifact\n- keep the custom subdomain managed by the repository Pages setting\n\n## Why\n- PR #43 merged the correct root-subdomain Jekyll config, but the Pages\ndeployment failed at actions/deploy-pages.\n- The failed artifact already has correc\n[…]\npicasoft.com/...\n- gh api repos/e0ipso/strikethroo/pages reports\ncname=strikethroo.canpicasoft.com and protected_domain_state=verified\n\nCo-authored-by: e0ipso <1140906+e0ipso@users.noreply.github.com>",
          "is_bot": false,
          "headline": "docs: remove Pages CNAME artifact (#44)",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-07-03T15:31:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6035ecf82b3f1cdb0a5a92c2efb5d1d25a6bb8cb",
          "body": null,
          "is_bot": false,
          "headline": "chore: ignore devcontainer lock",
          "author_name": "e0ipso",
          "author_login": "e0ipso",
          "committed_at": "2026-07-03T15:14:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2f3f852382d2c08624a186752de265c88f25bed8",
          "body": "## Summary\n- set the Jekyll docs canonical URL to strikethroo.canpicasoft.com\n- make the docs site build at the subdomain root with an empty Jekyll\nbaseurl\n- add docs/CNAME for the GitHub Pages custom subdomain\n- update public documentation links and init output to the subdomain\n\n## Verification\n- n\n[…]\nso/strikethroo is configured with\ncname=strikethroo.canpicasoft.com.\n- e0ipso/e0ipso.github.io remains configured for mateuaguilo.com.\n\nCo-authored-by: e0ipso <1140906+e0ipso@users.noreply.github.com>",
          "is_bot": false,
          "headline": "docs: update documentation domain (#43)",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-07-03T15:11:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3afa1da04f2172585cf13dda8e06a22067751987",
          "body": "## 3.7.0 (2026-07-03)\n\n* feat(skills): add phase readiness check (#42) ([26175bb](https://github.com/e0ipso/strikethroo/commit/26175bb)), closes [#42](https://github.com/e0ipso/strikethroo/issues/42)\n* chore: update devcontainer for CLI compatibility ([454a5f7](https://github.com/e0ipso/strikethroo/commit/454a5f7))\n* docs: update kenkeep ([4292c94](https://github.com/e0ipso/strikethroo/commit/4292c94))",
          "is_bot": false,
          "headline": "chore(release): 3.7.0 [skip ci]",
          "author_name": "semantic-release-bot",
          "author_login": "semantic-release-bot",
          "committed_at": "2026-07-03T13:46:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "26175bb3007c74d0178fc1ecb088b8ce1602f11b",
          "body": "## Summary\n- add a bundled phase readiness check for blueprint execution\n- move dependency and clarification validation out of PRE_PHASE hooks\n- update docs, fixtures, hook descriptions, and kenkeep release guidance\n\n## Tests\n- npm test\n\n---------\n\nCo-authored-by: e0ipso <1140906+e0ipso@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(skills): add phase readiness check (#42)",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-07-03T13:45:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "454a5f79692d170a7325a8e75775b891b52362d6",
          "body": null,
          "is_bot": false,
          "headline": "chore: update devcontainer for CLI compatibility",
          "author_name": "e0ipso",
          "author_login": "e0ipso",
          "committed_at": "2026-06-30T08:41:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4292c94586b6316d374ae87333369cf57bde9fa3",
          "body": null,
          "is_bot": false,
          "headline": "docs: update kenkeep",
          "author_name": "e0ipso",
          "author_login": "e0ipso",
          "committed_at": "2026-06-30T06:05:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "338bcd5061a502da7e4e08183ebdf9884ebf1e2c",
          "body": "## <small>3.6.1 (2026-06-29)</small>\n\n* fix: align package.json license with MIT LICENSE file ([fd3639d](https://github.com/e0ipso/strikethroo/commit/fd3639d))\n* ci: avoid sudo commands ([e324458](https://github.com/e0ipso/strikethroo/commit/e324458))\n* chore: allow autoupdate ([bb61d43](https://git\n[…]\n7956cb))\n* docs: add Cursor Cloud setup instructions to AGENTS.md (#41) ([65c24f0](https://github.com/e0ipso/strikethroo/commit/65c24f0)), closes [#41](https://github.com/e0ipso/strikethroo/issues/41)",
          "is_bot": false,
          "headline": "chore(release): 3.6.1 [skip ci]",
          "author_name": "semantic-release-bot",
          "author_login": "semantic-release-bot",
          "committed_at": "2026-06-29T12:18:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fd3639d7335ae19b5e9ff6eb587013b291d8f54f",
          "body": "Fix #26: npm metadata declared \"proprietary\" while LICENSE is MIT.\nUpdate package.json and package-lock.json to match README badge and LICENSE.",
          "is_bot": false,
          "headline": "fix: align package.json license with MIT LICENSE file",
          "author_name": "e0ipso",
          "author_login": "e0ipso",
          "committed_at": "2026-06-29T12:15:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e324458e8eae3a55f63a5eadd6263ff2b415900d",
          "body": null,
          "is_bot": false,
          "headline": "ci: avoid sudo commands",
          "author_name": "e0ipso",
          "author_login": "e0ipso",
          "committed_at": "2026-06-23T14:30:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bb61d437369cb0e36a647e8cd267257134c40640",
          "body": null,
          "is_bot": false,
          "headline": "chore: allow autoupdate",
          "author_name": "e0ipso",
          "author_login": "e0ipso",
          "committed_at": "2026-06-23T14:21:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "17956cb5d5abb3f00d8a7503c4099553a4e958fe",
          "body": null,
          "is_bot": false,
          "headline": "chore: simplify devcontainer",
          "author_name": "e0ipso",
          "author_login": "e0ipso",
          "committed_at": "2026-06-23T11:23:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "65c24f01c6c422daf79e5c883b333743c3947de6",
          "body": "<!-- CURSOR_AGENT_PR_BODY_BEGIN -->\n## Summary\n\nDocuments the non-obvious setup/run details for developing this repo in\na Cursor Cloud Agent VM. The detail lives in a standalone\n**`.cursor/cloud-instructions.md`** and `AGENTS.md` carries a short\non-demand pointer (loaded only when relevant, not inli\n[…]\nalt=\"Open in Cursor\" width=\"131\" height=\"28\"\nsrc=\"https://cursor.com/assets/images/open-in-cursor-dark.png\"></picture></a>&nbsp;</div>\n\n---------\n\nCo-authored-by: Cursor Agent <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "docs: add Cursor Cloud setup instructions to AGENTS.md (#41)",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-22T12:07:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3735a87172e21d33d14111fd3831e5fcd3375693",
          "body": "## 3.6.0 (2026-06-22)\n\n* feat(skills): execute prompt-correlation blueprint; move plan out of docs/ (#40) ([b53ba8f](https://github.com/e0ipso/strikethroo/commit/b53ba8f)), closes [#40](https://github.com/e0ipso/strikethroo/issues/40)",
          "is_bot": false,
          "headline": "chore(release): 3.6.0 [skip ci]",
          "author_name": "semantic-release-bot",
          "author_login": "semantic-release-bot",
          "committed_at": "2026-06-22T04:54:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b53ba8f44d304470d8651344bb083d3cca1c803f",
          "body": "…docs/ (#40)\n\nImplement the skills/prompt correlation improvements as additive\nprompt/hook text, with shared enforcement files as required workspace\nshape.\n\n- Add `src/skill-prompts/AUTHORING.md` as the prompt-authoring house\nstyle guide and link it from README/AGENTS.\n- Add anti-rationalization, cl\n[…]\nugh the `pretest:e2e` npm lifecycle so\nPR validation can run browser e2e tests without a missing executable.\n\nValidation:\n\n- `npm run build`\n- `npm test` (`190/190` unit, `36/36` e2e)\n- `npm run lint`",
          "is_bot": false,
          "headline": "feat(skills): execute prompt-correlation blueprint; move plan out of …",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-22T04:53:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fcd95666f1b1212e72e139c6035b84359599a572",
          "body": "## 3.5.0 (2026-06-21)\n\n* docs: update Kenkeep ([2dc934f](https://github.com/e0ipso/strikethroo/commit/2dc934f))\n* docs(plan): add strikethroo prompt-improvement plan from skills-framework correlation (#39) ([82995a3](https://github.com/e0ipso/strikethroo/commit/82995a3)), closes [#39](https://github\n[…]\n99))\n* chore: improve devcontainer ([1220785](https://github.com/e0ipso/strikethroo/commit/1220785))\n* chore: update kenkeep workspace ([58ca988](https://github.com/e0ipso/strikethroo/commit/58ca988))",
          "is_bot": false,
          "headline": "chore(release): 3.5.0 [skip ci]",
          "author_name": "semantic-release-bot",
          "author_login": "semantic-release-bot",
          "committed_at": "2026-06-21T15:37:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2dc934f67717e6835566b1e85969029851a19dfb",
          "body": null,
          "is_bot": false,
          "headline": "docs: update Kenkeep",
          "author_name": "e0ipso",
          "author_login": "e0ipso",
          "committed_at": "2026-06-21T15:36:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dc93599384fc0005c3d109fc3a8180dfbb1e59d3",
          "body": "Ship Cursor-enabled settings with the t3 feature and seed from them when\nno host copy is mounted, so the devcontainer works without manual setup.",
          "is_bot": false,
          "headline": "feat(devcontainer): enable Cursor in t3 via bundled default settings",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-21T15:36:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "58ca988743a3ac5c38512501283f4eaf5d6d92f8",
          "body": null,
          "is_bot": false,
          "headline": "chore: update kenkeep workspace",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-21T15:36:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1220785f97b8665bd9a162a33ca791bec9994320",
          "body": null,
          "is_bot": false,
          "headline": "chore: improve devcontainer",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-21T15:36:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "82995a39b97d49e722925d66e9bfda354a06bba6",
          "body": "…work correlation (#39)\n\nInvestigate obra/superpowers, addyosmani/agent-skills, and Amp\n(ampcode.com),\nand translate the highest-leverage, principle-preserving\nprompt/skill-content\ntechniques into a Strikethroo plan: anti-rationalization tables, an\nevidence-based verification gate, a one-question-at\n[…]\ne,\ntrigger-only skill descriptions (SDO), and a prompt-authoring house\nstyle.\n\nThe plan conforms to PLAN_TEMPLATE.md and is placed under docs/plans/\nbecause\n.ai/strikethroo is gitignored in this repo.",
          "is_bot": false,
          "headline": "docs(plan): add strikethroo prompt-improvement plan from skills-frame…",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-21T12:06:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c60e058e5ed45abb5b2ce4cd0bec97956d7771da",
          "body": "## <small>3.4.2 (2026-06-17)</small>\n\n* fix: use composite plan name for task links (#33) ([fb71586](https://github.com/e0ipso/strikethroo/commit/fb71586)), closes [#33](https://github.com/e0ipso/strikethroo/issues/33)",
          "is_bot": false,
          "headline": "chore(release): 3.4.2 [skip ci]",
          "author_name": "semantic-release-bot",
          "author_login": "semantic-release-bot",
          "committed_at": "2026-06-17T15:22:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fb715863b8ed6f6f6e113dfced41484a5bd53066",
          "body": "The Tasks-tab swimlanes passed String(detail.id) as the planId,\nproducing task-detail URLs from the bare numeric id, which no longer\nresolve under the composite {id}--{slug} routing contract. Pass\ndetail.name so links address the canonical plan key.\n\nAdd unit coverage for taskNav and plans derive helpers, an e2e\nregression for zero-padded ids, and wire the new unit suites into\nvitest.config.",
          "is_bot": false,
          "headline": "fix: use composite plan name for task links (#33)",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-17T15:09:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fee05fe224d4c456244cc179c7dd34503d592122",
          "body": "## <small>3.4.1 (2026-06-17)</small>\n\n* fix: cache self-review availability ([c7c65f5](https://github.com/e0ipso/strikethroo/commit/c7c65f5))\n* chore: improve devcontainer ([04f85c9](https://github.com/e0ipso/strikethroo/commit/04f85c9))\n* chore: upgrade to Kenkeep (#25) ([6e39138](https://github.co\n[…]\noo/commit/dadb183))\n* docs: update docs visuals ([ba99d4c](https://github.com/e0ipso/strikethroo/commit/ba99d4c))\n* ci: fix gha issues ([0c09844](https://github.com/e0ipso/strikethroo/commit/0c09844))",
          "is_bot": false,
          "headline": "chore(release): 3.4.1 [skip ci]",
          "author_name": "semantic-release-bot",
          "author_login": "semantic-release-bot",
          "committed_at": "2026-06-17T14:41:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c7c65f54a436486173a3396deaffc42882d83961",
          "body": null,
          "is_bot": false,
          "headline": "fix: cache self-review availability",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-17T14:39:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "04f85c9759f338f1c4b78dd5f62f83900878faeb",
          "body": null,
          "is_bot": false,
          "headline": "chore: improve devcontainer",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-17T14:36:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6e39138cececac4d4c23e4fbbb9ff67f3f265845",
          "body": null,
          "is_bot": false,
          "headline": "chore: upgrade to Kenkeep (#25)",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-10T16:43:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "13a4b1bd3ff8c484c54eda2fb328ef4d6320dac8",
          "body": null,
          "is_bot": false,
          "headline": "docs: update docs visuals",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-08T21:38:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e77516fd75da2907c0fc7fa3feac9d5872619eeb",
          "body": null,
          "is_bot": false,
          "headline": "docs: update docs visuals",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-08T21:24:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f97d5cf9c7423d7ca961b0df4fb073fa2fa08f96",
          "body": null,
          "is_bot": false,
          "headline": "docs: update docs visuals",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-08T21:23:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "224021a565e5173eeccf075721fb9a00e51e1208",
          "body": null,
          "is_bot": false,
          "headline": "docs: update docs visuals",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-08T21:20:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1eb94ecf7ac3b9f4d3a77d67d18bec65f841f514",
          "body": null,
          "is_bot": false,
          "headline": "docs: update docs visuals",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-08T20:18:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b94528d9f62cf8009acd30df39e7307fa38c284e",
          "body": null,
          "is_bot": false,
          "headline": "docs: update docs visuals",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-08T15:48:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "86c5d56d18c76b74bb18d3a13b24839853b09891",
          "body": null,
          "is_bot": false,
          "headline": "docs: update docs visuals",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-08T14:09:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dadb1836f459b17ddd6e553abcc829bfb90c5bf7",
          "body": null,
          "is_bot": false,
          "headline": "docs: update docs visuals",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-08T14:06:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ba99d4c904317188242be587d35a3303c2ee1b98",
          "body": null,
          "is_bot": false,
          "headline": "docs: update docs visuals",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-08T10:29:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "da73fe40b42853c459558c9c75abdf6a0b12fcd2",
          "body": null,
          "is_bot": false,
          "headline": "docs: align logo",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-03T11:43:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "74d4954ffea3def77913a18b9b7f7e206a71f1c2",
          "body": null,
          "is_bot": false,
          "headline": "docs: add screenshots to documentation",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-03T11:05:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a548121e693387b3c56a3c8108f318320f600aa7",
          "body": "Deep-link each hook name to its section in the customization guide.",
          "is_bot": false,
          "headline": "docs: note when lifecycle hooks run in the workflow guide",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-03T10:52:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5f9892feb6bfbc47f05daffc370ef6873a2549d1",
          "body": null,
          "is_bot": false,
          "headline": "docs: fix version typo",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-03T10:45:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0c0984445b821d87d2dd2d330dabd1de8d748b7b",
          "body": null,
          "is_bot": false,
          "headline": "ci: fix gha issues",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-03T09:41:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2431326ef8d7a6c2f2d04c0e7651cb6d867b38dc",
          "body": null,
          "is_bot": false,
          "headline": "docs: improve documentation site",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-03T09:23:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d374d74e375b8d96c1c9d216db1f665992f0d48e",
          "body": null,
          "is_bot": false,
          "headline": "docs: improve documentation site",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-03T09:15:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "07a5d53ec62be4f71e9623b2f8daa85331c3f737",
          "body": null,
          "is_bot": false,
          "headline": "docs: improve documentation site",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-03T09:08:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c081724aefcf0dbc166237eaa2250523f192fd64",
          "body": "## 3.4.0 (2026-06-03)\n\n* docs: update doc site styles ([c730e14](https://github.com/e0ipso/strikethroo/commit/c730e14))\n* docs: update screenshots and recordings ([666c916](https://github.com/e0ipso/strikethroo/commit/666c916))\n* fix: make the wordmark correct again ([0765a08](https://github.com/e0i\n[…]\nmposite directory name ([2a93b92](https://github.com/e0ipso/strikethroo/commit/2a93b92))\n* refactor(web): drop Tasks tab view selector ([a4fe50b](https://github.com/e0ipso/strikethroo/commit/a4fe50b))",
          "is_bot": false,
          "headline": "chore(release): 3.4.0 [skip ci]",
          "author_name": "semantic-release-bot",
          "author_login": "semantic-release-bot",
          "committed_at": "2026-06-03T07:39:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c730e14250a03b8af0c01d460392d4c23adac983",
          "body": null,
          "is_bot": false,
          "headline": "docs: update doc site styles",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-03T07:38:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0765a0861f4ae08c72275bdb474e925ca2bf27a8",
          "body": null,
          "is_bot": false,
          "headline": "fix: make the wordmark correct again",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-03T05:55:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c108d9582f720b8b6c1c9a89d2617acb4adfed43",
          "body": "# Conflicts:\n#\tdist-web/assets/arc-D7TGh2OG.js\n#\tdist-web/assets/architectureDiagram-3BPJPVTR-DXC4RNTr.js\n#\tdist-web/assets/blockDiagram-GPEHLZMM-BVdkKkev.js\n#\tdist-web/assets/c4Diagram-AAUBKEIU-Cg-y90jl.js\n#\tdist-web/assets/chunk-2J33WTMH-D-JGefPN.js\n#\tdist-web/assets/chunk-4BX2VUAB-0BK2g0H2.js\n#\td\n[…]\nam-CIIHVFJN-B2iX_aFJ.js\n#\tdist-web/assets/wardley-L42UT6IY-HtF3_dQK.js\n#\tdist-web/assets/wardleyDiagram-YWT4CUSO-Dv7BTISB.js\n#\tdist-web/assets/xychartDiagram-2RQKCTM6-BWkJ9p7T.js\n#\tdist-web/index.html",
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/main'",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-03T05:51:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e37cb1361cd0b642c9d4a942707206ea06a10b5b",
          "body": null,
          "is_bot": false,
          "headline": "chore: update the knowledge base",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-03T05:45:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "666c916c501f8a9dfd0fcf82d3239035300f28db",
          "body": null,
          "is_bot": false,
          "headline": "docs: update screenshots and recordings",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-03T05:22:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "11e641608d5b99341b56942c76027713f6591433",
          "body": "The serve API and SPA routing now key plans on the composite\n{id}--{slug} name, but the capture harness still built detail URLs\nfrom the numeric plan id. The new route grammar rejects a bare id, so\nevery /api/plans/:id fetch failed, selectPlan returned null, and the\nPlan Detail stills and interaction videos were skipped.\n\nSwitch the API fetch, page navigations, and the openGraph/openTasks\nhelpers to the plan's composite name.",
          "is_bot": false,
          "headline": "fix(capture): use composite plan key in URLs",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-03T05:15:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2a93b9298a5148cdab90933750ca75e52f744826",
          "body": "Route and resolve plans by the unique composite {id}--{slug} directory\nname instead of the collision-prone numeric id.\n\nServe: parsePlanId/parseArchivePlanId validate the segment against\n^[0-9]+--[a-z0-9-]+$ after one URL-decode; getPlanDetail/archivePlan\nresolve by exact match against the enumerate\n[…]\nvePlan address plans by name;\ntask :taskId and the numeric sort comparator are unchanged.\n\nTests and AGENTS.md updated to the composite-key contract, adding\nclean-break and traversal-payload coverage.",
          "is_bot": false,
          "headline": "feat(web): route plans by composite directory name",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-02T20:26:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a4fe50b4147c9040faa85dbd70fff3ae044fc51d",
          "body": "The Plan Detail Tasks tab now renders the Swimlanes view directly with\nno in-screen view selector. Swimlanes was already the default, and the\nOutline view was only reachable through the selector, so remove it:\ndelete ExecOutlineView and the now-dead execSummaryOf derivation (the\nExecution Summary it surfaced is still shown on the Results tab). Update\nthe e2e/capture suites and AGENTS.md to match.",
          "is_bot": false,
          "headline": "refactor(web): drop Tasks tab view selector",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-02T20:12:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cf1fe7916ab995df11ea401716596170021aaa9e",
          "body": null,
          "is_bot": false,
          "headline": "chore: remove dist assets from the repo",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-02T19:42:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c9a1e8a9e71c829dc50f5e448a0e67a2a3c861f9",
          "body": "## <small>3.3.1 (2026-06-02)</small>\n\n* Merge remote-tracking branch 'origin/main' ([b809af1](https://github.com/e0ipso/strikethroo/commit/b809af1))\n* fix: dev server optimizations ([50cd0b9](https://github.com/e0ipso/strikethroo/commit/50cd0b9))\n* chore: add empty message ([91b6918](https://github.com/e0ipso/strikethroo/commit/91b6918))\n* refactor(web): utility-first Tailwind styling ([8b3b179](https://github.com/e0ipso/strikethroo/commit/8b3b179))",
          "is_bot": false,
          "headline": "chore(release): 3.3.1 [skip ci]",
          "author_name": "semantic-release-bot",
          "author_login": "semantic-release-bot",
          "committed_at": "2026-06-02T19:26:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b809af1b591d26243134ca9052a88efe5cad2097",
          "body": null,
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/main'",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-02T19:25:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "50cd0b926b91bed80d8ea3d3984da52541d8bef3",
          "body": null,
          "is_bot": false,
          "headline": "fix: dev server optimizations",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-02T19:23:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "91b69189fbf6233a3b825c4bf33ed53e93a3042a",
          "body": null,
          "is_bot": false,
          "headline": "chore: add empty message",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-02T19:23:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8b3b17907f670e3692fad65a3b6a3e6bf639a6e1",
          "body": "Replace the vendored semantic-CSS layer with utility-first\nTailwind v4. Components emit default-scale + @theme token\nutilities; the 10 vendored component/screen CSS files are\nremoved, leaving fonts, the @theme tokens (with a .dark token\nswap), a minimal base reset, and a scoped mermaid block.\n\nBrand\n[…]\nevDependency only).\n\nThe e2e suite and capture harness are retargeted from removed\nclass names to role/text/aria/data-testid selectors; docs\nvisuals regenerated. npm test is green (178 unit + 37 e2e).",
          "is_bot": false,
          "headline": "refactor(web): utility-first Tailwind styling",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-02T16:54:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f23ec367fde75d2af684f8bcdac4cb15d0c4d560",
          "body": "## 3.3.0 (2026-06-02)\n\n* Merge remote-tracking branch 'origin/main' ([dc58000](https://github.com/e0ipso/strikethroo/commit/dc58000))\n* feat(capture): repeatable captures via fixture ([8f4f0a1](https://github.com/e0ipso/strikethroo/commit/8f4f0a1))\n* feat(web): drop view tabs from Archive screen ([9\n[…]\n, fix violations ([0a36468](https://github.com/e0ipso/strikethroo/commit/0a36468))\n* test(web): rewrite Customize e2e for the redesign ([72a3c84](https://github.com/e0ipso/strikethroo/commit/72a3c84))",
          "is_bot": false,
          "headline": "chore(release): 3.3.0 [skip ci]",
          "author_name": "semantic-release-bot",
          "author_login": "semantic-release-bot",
          "committed_at": "2026-06-02T13:45:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dc58000e8dd03672e0d3518f49c30cdce6ade057",
          "body": "# Conflicts:\n#\tdist-web/assets/arc-CVtV5as-.js\n#\tdist-web/assets/architectureDiagram-3BPJPVTR-BYynksNB.js\n#\tdist-web/assets/blockDiagram-GPEHLZMM-Ct9Nu_pq.js\n#\tdist-web/assets/c4Diagram-AAUBKEIU-Dgzh7Ewq.js\n#\tdist-web/assets/chunk-2J33WTMH-BDyvxENl.js\n#\tdist-web/assets/chunk-4BX2VUAB-BhfZaKRN.js\n#\td\n[…]\nam-CIIHVFJN-BByKaCrp.js\n#\tdist-web/assets/wardley-L42UT6IY-mtvLR0Ck.js\n#\tdist-web/assets/wardleyDiagram-YWT4CUSO-DSGZD8JP.js\n#\tdist-web/assets/xychartDiagram-2RQKCTM6-BnMNxVn0.js\n#\tdist-web/index.html",
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/main'",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-02T13:40:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8f4f0a1acae471982d5830c8c07e9a8bf6ec08ff",
          "body": "Drive the capture harness from a committed fixture workspace\n(src/capture/fixtures/capture-workspace: plans 102-104 plus a few\narchived plans and a full config/) instead of the gitignored, mutable\nlive .ai/strikethroo/ workspace, so npm run capture:web is deterministic\nand regenerable. Override with\n[…]\nshell, tasks-outline, archive-by-month, archive-date-range\nstills and the live-update-sse and archive-sort-and-filter videos; prune\ntheir files and update docs/web-app.md, AGENTS.md, and the captions.",
          "is_bot": false,
          "headline": "feat(capture): repeatable captures via fixture",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-02T11:23:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "776cbcbc9a3452d608a087aa00ecb657b8446ff7",
          "body": "Establish the serve web app as Strikethroo's visualization layer.\n\nAdd a reusable Playwright capture harness (npm run capture:web,\nsrc/capture/capture-web.ts) that serves the repo's own workspace via\nstartServer, drives a real Chromium against dist-web/, dynamically\nselects a representative plan, an\n[…]\n as narrative context. Expand the README\nserve section with a hi-res preview and a link to the new page, add\ncross-links from docs/index.md and docs/workflow.md, and document the\nharness in AGENTS.md.",
          "is_bot": false,
          "headline": "docs(web-app): add capture harness and visuals",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-02T10:37:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "677eec2fac971188085f2e86dbee856256fae35e",
          "body": null,
          "is_bot": false,
          "headline": "fix: minor improvements",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-02T09:19:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a0019d03d936444a2a59a6ff10b7682e12eaf8ed",
          "body": "Run eslint --fix and prettier --write on staged files via the\npre-commit hook, replacing the unscoped npm run lint (npm test\nstill runs). Widen the lint and format scripts to cover tsx, and\nexclude vendored CSS and dist-web from prettier.",
          "is_bot": false,
          "headline": "build: add lint-staged for lint and format",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-02T09:01:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0a364684cee75dcead25243343d13dfac62ebe08",
          "body": "Add shared browser globals to the test ESLint block (e2e\npage.evaluate callbacks use location/URL/document) and\n__APP_VERSION__ to the web SPA block, then clear the unused\nimports and dead helpers this surfaces across the suite.",
          "is_bot": false,
          "headline": "chore(lint): lint tsx and test files, fix violations",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-02T09:01:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e26114f54ca8b8ca888223a3088ee91ff5851d59",
          "body": null,
          "is_bot": false,
          "headline": "chore: fix formatting",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-02T08:56:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "92b10a8d19e6fc6d983752b8674cf923a3f1c10c",
          "body": null,
          "is_bot": false,
          "headline": "chore: remove dist assets from the repo",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-02T08:42:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "72a3c844dde3ba503c1ba713538d72f4514f9917",
          "body": "Cover the new card-grid listing, the editor detail route, the save\nround-trip (against an isolated temp workspace fixture), and the\nnot-found state. Replaces the assertions for the removed read-only\nHooks/Templates views.",
          "is_bot": false,
          "headline": "test(web): rewrite Customize e2e for the redesign",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-02T08:41:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "94cf101658b6201d3f7d6136b0bbcab7d7c3c06f",
          "body": "The Archive screen no longer has an All / By-month view switcher; the\nBy-month grouping is now the only view. The empty-archive and no-results\nstates move into the month-groups renderer and the flat-table view is\nremoved.",
          "is_bot": false,
          "headline": "feat(web): drop view tabs from Archive screen",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-02T08:40:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "233f39c1b456373f5831edf6d7701527e534a167",
          "body": "Surface the hosting project's identity in the sidebar footer. The serve\ncapabilities endpoint (GET /api/capabilities) now derives the project\nname and path from the workspace root (deriveProject) and returns them\nas an optional `project` field; the SPA types it as ProjectInfo and the\nSidebar footer renders the name.",
          "is_bot": false,
          "headline": "feat(web): show hosting project in sidebar footer",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-02T08:40:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "46e8db58bd42b017871ea0296b7f697fd65e4426",
          "body": "Redesign the Customize section into the listing->detail pattern used\nelsewhere. Both Hooks and Templates tabs now render the same responsive\nCSS-grid of cards (ConfigCardGrid, 3->2->1 columns); each card shows the\nworkspace-relative path, the file id, and an optional description.\n\nDescriptions come \n[…]\ntion). getConfig now surfaces a\nworkspace-relative relPath. The legacy HooksView/TemplatesView and their\ninert actions are removed.\n\nCodeMirror and the YAML plugin are build-time devDependencies only.",
          "is_bot": false,
          "headline": "feat(web): editable Customize card grid + editor",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-02T08:39:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "de5af44d186ed4c4838fd3dd03ce93a71c0af01a",
          "body": "## 3.2.0 (2026-06-01)\n\n* feat(web): drop the List view from the Plans switcher ([bdb46a2](https://github.com/e0ipso/strikethroo/commit/bdb46a2))",
          "is_bot": false,
          "headline": "chore(release): 3.2.0 [skip ci]",
          "author_name": "semantic-release-bot",
          "author_login": "semantic-release-bot",
          "committed_at": "2026-06-01T21:22:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bdb46a2bbd33e5e79be3b582238893806957ef70",
          "body": "Reduce the Plans switcher to Board and Cards, removing the List tab and\nits now-orphaned PlansListView component. Board and Cards already provide\nnavigation, review, and archive controls (Cards renders done plans\ndirectly), so no functionality is lost. Repoint the row-navigation and\narchive e2e suites at the Cards grid and update AGENTS.md.",
          "is_bot": false,
          "headline": "feat(web): drop the List view from the Plans switcher",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-01T21:20:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5df0f3cdf3a4fd4c42b7c183229af0c989ebeb7e",
          "body": "## 3.1.0 (2026-06-01)\n\n* docs: document the archive action as serve's single mutation (plan 93 phase 4) ([04b3749](https://github.com/e0ipso/strikethroo/commit/04b3749))\n* docs: fix 1.x workspace paths in migration guide (#23) ([3e43a8c](https://github.com/e0ipso/strikethroo/commit/3e43a8c)), closes\n[…]\n npm files ([d3dd1f4](https://github.com/e0ipso/strikethroo/commit/d3dd1f4))\n* build(web): wire build:web into the npm run build chain ([374a213](https://github.com/e0ipso/strikethroo/commit/374a213))",
          "is_bot": false,
          "headline": "chore(release): 3.1.0 [skip ci]",
          "author_name": "semantic-release-bot",
          "author_login": "semantic-release-bot",
          "committed_at": "2026-06-01T20:18:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3d18a6ed84a5ce664212db28ca4b2ffdb529dd98",
          "body": "Record reusing or starting a dev:serve instance on :4317 (rebuild\ndist-web for source changes, or dev:web HMR at :5173) to visually\ninspect the SPA, including the sandbox-isolation caveat.",
          "is_bot": false,
          "headline": "docs(kb): add dev:serve visual-debug practice node",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-01T20:11:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2b82a94de52583fe88401721bc267c50edab5e74",
          "body": "Replace the Task Detail right rail with an inline .reader__meta row of\ngroup/skills/dependency items, letting the prose run full-width with no\nstranded column. Done state now reads as a struck-through, muted page\ntitle rather than a status pill, matching the blueprint rails.",
          "is_bot": false,
          "headline": "refactor(web): inline task meta into reader header",
          "author_name": "Mateu Aguiló Bosch",
          "author_login": "e0ipso",
          "committed_at": "2026-06-01T20:11:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 100,
      "commits_last_year": 629,
      "latest_release_at": "2026-07-17T13:39:42Z",
      "latest_release_tag": "v3.14.3",
      "releases_from_tags": false,
      "days_since_last_push": 5,
      "active_weeks_last_year": 34,
      "days_since_latest_release": 5,
      "mean_days_between_releases": 1
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 57,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "strikethroo",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "cli",
            "task-management",
            "ai",
            "npx",
            "typescript"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/strikethroo",
          "is_deprecated": false,
          "latest_version": "3.14.3",
          "repository_url": "https://github.com/e0ipso/strikethroo",
          "versions_count": 24,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 2109,
          "first_published_at": "2026-05-28T20:37:29.637000Z",
          "latest_published_at": "2026-07-17T13:39:41.495000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        }
      ]
    },
    "popularity": {
      "forks": 3,
      "stars": 43,
      "watchers": 0,
      "fork_history": {
        "days": [
          {
            "date": "2026-03-25",
            "count": 1
          },
          {
            "date": "2026-05-29",
            "count": 1
          },
          {
            "date": "2026-07-08",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 3,
        "total_forks": 3
      },
      "star_history": null,
      "open_issues_and_prs": 7
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": true,
      "typecheck_configs": [
        "tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 242435,
      "source_files_sampled": 168,
      "oversized_source_files": 5,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 28853
    },
    "dependencies": {
      "manifests": [
        "docs/Gemfile",
        "package.json"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm",
        "rubygems"
      ],
      "dependencies": [
        {
          "name": "chalk",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.6.0"
        },
        {
          "name": "commander",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^11.1.0"
        },
        {
          "name": "diff",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.2.0"
        },
        {
          "name": "fs-extra",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^11.3.1"
        },
        {
          "name": "gray-matter",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.0.3"
        },
        {
          "name": "inquirer",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^9.3.8"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 1,
        "merged_prs": 35,
        "open_issues": 6,
        "closed_ratio": 0.793,
        "closed_issues": 23,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "e0ipso",
          "commits": 462,
          "avatar_url": "https://avatars.githubusercontent.com/u/1140906?v=4"
        },
        {
          "type": "User",
          "login": "semantic-release-bot",
          "commits": 110,
          "avatar_url": "https://avatars.githubusercontent.com/u/32174276?v=4"
        },
        {
          "type": "User",
          "login": "claude",
          "commits": 56,
          "avatar_url": "https://avatars.githubusercontent.com/u/81847?v=4"
        },
        {
          "type": "User",
          "login": "m4olivei",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/191049?v=4"
        }
      ],
      "contributors_sampled": 4,
      "top_contributor_share": 0.734
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "docs.yml",
        "release.yml",
        "test.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        ".eslintrc.js",
        "eslint.config.mjs"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "package-lock.json"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 3,
            "reason": "branch protection is not maximal on development and all release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 9,
            "reason": "11 out of 12 merged PRs checked by a CI test -- score normalized to 9",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 9 contributing companies or organizations",
            "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 22 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": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 1,
            "reason": "dependency not pinned by hash detected -- score normalized to 1",
            "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": 4,
            "reason": "security policy file 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": "65 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "96cea9ed5045a8da35165c4ba0d875e8f12cd6df",
        "ran_at": "2026-07-22T18:14:05Z",
        "aggregate_score": 5.1,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": true,
      "has_dependabot_config": true
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-17T13:39:18Z",
      "oldest_open_prs": [
        {
          "number": 50,
          "created_at": "2026-07-08T18:05:17Z",
          "last_comment_at": "2026-07-18T06:02:36Z",
          "last_comment_author": "e0ipso"
        }
      ],
      "last_merged_pr_at": "2026-07-17T13:37:42Z",
      "ci_last_conclusion": null,
      "oldest_open_issues": [
        {
          "number": 27,
          "created_at": "2026-06-17T14:00:04Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 28,
          "created_at": "2026-06-17T14:00:28Z",
          "last_comment_at": "2026-06-29T13:31:07Z",
          "last_comment_author": "e0ipso"
        },
        {
          "number": 49,
          "created_at": "2026-07-08T17:10:11Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 51,
          "created_at": "2026-07-09T15:38:25Z",
          "last_comment_at": "2026-07-13T14:52:42Z",
          "last_comment_author": "revagomes"
        },
        {
          "number": 61,
          "created_at": "2026-07-15T11:48:14Z",
          "last_comment_at": "2026-07-15T21:57:14Z",
          "last_comment_author": "e0ipso"
        },
        {
          "number": 66,
          "created_at": "2026-07-22T06:11:41Z",
          "last_comment_at": "2026-07-22T15:27:47Z",
          "last_comment_author": "jdleonard"
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/e0ipso/strikethroo",
    "host": "github.com",
    "name": "strikethroo",
    "owner": "e0ipso"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 69,
      "inputs": {
        "security": 51,
        "vitality": 93,
        "community": 43,
        "governance": 64,
        "engineering": 85
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 93,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "excellent",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 88,
            "inputs": {
              "commits_last_year": 629,
              "human_commit_share": 1,
              "days_since_last_push": 5,
              "active_weeks_last_year": 34
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 5 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "34/52 weeks with commits",
                "points": 23.5,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 34
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "629 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 629
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 22 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "releases_count": 100,
              "latest_release_tag": "v3.14.3",
              "releases_from_tags": false,
              "days_since_latest_release": 5,
              "mean_days_between_releases": 1
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "100 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 100
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 5 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~1 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 1
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "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": 5,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 5 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 43,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 29,
            "inputs": {
              "forks": 3,
              "stars": 43,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "43 stars",
                "points": 26.3,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 43
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "3 forks",
                "points": 2.5,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 55,
            "inputs": {
              "packages": [
                "strikethroo"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 2109
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "2,109 downloads/month across npm",
                "points": 44.3,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 2109,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 64,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 30,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 4,
              "top_contributor_share": 0.734
            },
            "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 73% of commits",
                "points": 6,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 73
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "4 contributors",
                "points": 5.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 9 contributing companies or organizations",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 75,
            "inputs": {
              "merged_prs": 35,
              "open_issues": 6,
              "closed_issues": 23,
              "issue_closed_ratio": 0.793,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "79% of issues closed",
                "points": 37.1,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 79
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "35/35 decided PRs merged",
                "points": 38.2,
                "status": "met",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 35,
                      "decided": 35
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 64,
            "inputs": {
              "followers": 156,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "e0ipso",
              "public_repos": 109,
              "account_age_days": 5389
            },
            "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": "156 followers of e0ipso",
                "points": 15.8,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 156,
                      "login": "e0ipso"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "109 public repos, account ~14 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 109
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 14
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "strikethroo"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 5
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 5 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "24 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 24
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "excellent",
        "name": "Engineering Quality",
        "value": 85,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 82,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "3 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": ".eslintrc.js, eslint.config.mjs",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".eslintrc.js, eslint.config.mjs"
                    }
                  }
                ],
                "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": "11 out of 12 merged PRs checked by a CI test -- score normalized to 9",
                "points": 18,
                "status": "partial",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "topics": [
                "agents",
                "ai",
                "claude-code",
                "code-generation",
                "codex",
                "coding-assistant",
                "gemini-cli",
                "opencode"
              ],
              "has_wiki": false,
              "homepage": "https://strikethroo.canpicasoft.com",
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://strikethroo.canpicasoft.com",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "8 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 8
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "moderate",
        "name": "Security",
        "value": 51,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "moderate",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 51,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 5.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 is not maximal on development and all release branches",
                "points": 2.2,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "11 out of 12 merged PRs checked by a CI test -- score normalized to 9",
                "points": 2.2,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 9 contributing companies or organizations",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "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 22 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 detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 1",
                "points": 0.5,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file detected",
                "points": 2,
                "status": "partial",
                "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": "65 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 4
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "good",
        "name": "AI Readiness",
        "value": 73,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.99,
              "agent_instruction_files": [
                "AGENTS.md",
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 28853
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md, CLAUDE.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "99 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 99,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 62,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "package-lock.json"
              ],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": true,
              "has_linter_config": true,
              "typecheck_configs": [
                "tsconfig.json"
              ],
              "agent_commit_share": 0.01,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": ".eslintrc.js, eslint.config.mjs",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".eslintrc.js, eslint.config.mjs"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "devcontainer, lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "devcontainer, lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "1 of the last 100 commits agent-authored or agent-credited",
                "points": 2,
                "status": "partial",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 1,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "dependency automation configured, none observed in the sampled commits",
                "points": 5,
                "status": "partial",
                "details": [
                  {
                    "code": "dependency_bot_config_only",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 1",
                "points": 1,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "good",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 80,
            "inputs": {
              "primary_language": "JavaScript",
              "largest_source_bytes": 242435,
              "source_files_sampled": 168,
              "oversized_source_files": 5
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "JavaScript with type-check config (tsconfig.json)",
                "points": 27,
                "status": "partial",
                "details": [
                  {
                    "code": "typecheck_config_language",
                    "params": {
                      "files": "tsconfig.json",
                      "language": "JavaScript"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "5/168 source files over 60KB",
                "points": 53.4,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 168,
                      "oversized": 5
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
    "deps.dev does not index npm:strikethroo@3.14.3; advisories assessed against the repository dependency graph instead"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-22T18:14:19.144322Z",
  "schema_version": "0.26.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/e/e0ipso/strikethroo.svg",
  "full_name": "e0ipso/strikethroo",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

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