原始 JSON 报告 机器可读
{
"data": {
"repo": {
"topics": [],
"is_fork": false,
"size_kb": 1737,
"has_wiki": false,
"homepage": null,
"languages": {
"Go": 1858583,
"HCL": 5713,
"Shell": 2730,
"Makefile": 3633,
"Dockerfile": 3928
},
"pushed_at": "2026-07-19T03:42:26Z",
"created_at": "2026-02-15T10:25:10Z",
"owner_type": "User",
"updated_at": "2026-07-18T10:04:46Z",
"description": null,
"is_archived": false,
"is_disabled": false,
"license_spdx": null,
"default_branch": "develop",
"license_spdx_raw": null,
"primary_language": "Go",
"significant_languages": [
"Go"
]
},
"owner": {
"blog": "http://www.eyelock.net/blog",
"name": "David Collie",
"type": "User",
"login": "eyelock",
"company": null,
"location": null,
"followers": 3,
"avatar_url": "https://avatars.githubusercontent.com/u/1277325?v=4",
"created_at": "2011-12-21T10:08:32Z",
"is_verified": null,
"public_repos": 12,
"account_age_days": 5333
},
"license": {
"state": "absent",
"spdx_id": null,
"raw_spdx": null,
"file_present": false,
"scorecard_found": false,
"profile_has_license": false
},
"activity": {
"releases": [
{
"tag": "v0.4.1",
"kind": "patch",
"published_at": "2026-07-17T20:49:12Z"
},
{
"tag": "v0.4.0",
"kind": "minor",
"published_at": "2026-05-13T07:17:10Z"
},
{
"tag": "v0.3.2",
"kind": "patch",
"published_at": "2026-05-12T08:26:14Z"
},
{
"tag": "v0.3.1",
"kind": "patch",
"published_at": "2026-05-12T05:45:12Z"
},
{
"tag": "v0.3.0",
"kind": "minor",
"published_at": "2026-05-11T08:29:44Z"
},
{
"tag": "v0.2.3",
"kind": "patch",
"published_at": "2026-04-29T19:38:23Z"
},
{
"tag": "v0.2.2",
"kind": "patch",
"published_at": "2026-04-29T05:11:49Z"
},
{
"tag": "v0.2.1",
"kind": "patch",
"published_at": "2026-04-28T22:11:49Z"
},
{
"tag": "v0.2.0",
"kind": "minor",
"published_at": "2026-04-27T20:28:50Z"
},
{
"tag": "v0.1.2",
"kind": "patch",
"published_at": "2026-04-22T06:17:36Z"
},
{
"tag": "v0.1.1",
"kind": "patch",
"published_at": "2026-04-20T20:27:26Z"
},
{
"tag": "v0.1.0",
"kind": "minor",
"published_at": "2026-04-19T07:14:20Z"
},
{
"tag": "v0.0.19",
"kind": "patch",
"published_at": "2026-04-18T23:41:56Z"
},
{
"tag": "v0.0.18",
"kind": "patch",
"published_at": "2026-04-18T22:57:22Z"
},
{
"tag": "v0.0.16",
"kind": "patch",
"published_at": "2026-04-17T23:47:55Z"
},
{
"tag": "v0.0.15",
"kind": "patch",
"published_at": "2026-04-17T22:49:30Z"
},
{
"tag": "v0.0.14",
"kind": "patch",
"published_at": "2026-04-17T11:39:12Z"
},
{
"tag": "v0.0.13",
"kind": "patch",
"published_at": "2026-04-08T23:15:03Z"
},
{
"tag": "v0.0.12",
"kind": "patch",
"published_at": "2026-04-08T07:08:41Z"
},
{
"tag": "v0.0.11",
"kind": "patch",
"published_at": "2026-03-22T23:53:56Z"
},
{
"tag": "v0.0.10",
"kind": "patch",
"published_at": "2026-03-22T10:11:35Z"
},
{
"tag": "v0.0.9",
"kind": "patch",
"published_at": "2026-03-21T23:23:04Z"
},
{
"tag": "v0.0.8",
"kind": "patch",
"published_at": "2026-03-21T23:01:45Z"
},
{
"tag": "v0.0.7",
"kind": "patch",
"published_at": "2026-03-14T20:51:18Z"
},
{
"tag": "v0.0.6",
"kind": "patch",
"published_at": "2026-03-14T20:36:08Z"
},
{
"tag": "v0.0.5",
"kind": "patch",
"published_at": "2026-02-16T00:10:33Z"
},
{
"tag": "v0.0.4",
"kind": "patch",
"published_at": "2026-02-15T23:49:19Z"
},
{
"tag": "v0.0.3",
"kind": "patch",
"published_at": "2026-02-15T20:53:28Z"
},
{
"tag": "v0.0.2",
"kind": "patch",
"published_at": "2026-02-15T20:44:37Z"
}
],
"recent_commits": [
{
"oid": "97001a4fde38dca29056637b4b63ced933d3efe6",
"body": "* feat(agent): add ynh agent run loop driver (Phase 1)\n\nImplements the Phase 1 loop driver as `ynh agent run`, embedding\nit in the ynh binary per the agent-loop plan. The loop driver is\nthe missing orchestration layer that sits above ynh's sensor\nexecution: it spawns a vendor agent subprocess, runs \n[…]\nand docs.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(agent): turn-level resume for `ynh agent run` (#175)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-07-18T10:04:32Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f4422ff95d5db5224d739a9fb073ded8e7a5d006",
"body": "…s (#183)\n\nTutorial 1 documented pre-canonical-id output for `ynh install` (Location\npointed at ~/.ynh/harnesses/local--<name>) and `ynh info` (missing the ID\nline). Local installs are pointer-form and now report the source tree as\nLocation, and info always leads with the canonical ID.\n\n\nClaude-Session: https://claude.ai/code/session_01AvRQcbHL3ULrhUegifvXtU\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Sonnet 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(tutorial): fix T1 expected output for canonical-id local install…",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-07-18T09:53:14Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "28d90ed764fef4a0a1d7d5f82b559a9a52b6d02e",
"body": "Bumps [actions/checkout](https://github.com/actions/checkout) from 6 to 7.\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/actions/checkout/compare/v6...v7)\n\n---\nupdated-dependenc\n[…]\nirect:production\n update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "ci: bump actions/checkout from 6 to 7 (#176)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-07-18T09:18:34Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e61fa4e25996fe06e7dc17298992813a8db93701",
"body": "…(#182)\n\ntest/e2e/image_test.go still asserted the pre-#174 bare-name\nentrypoint (\"ynh run imaged\"). #174 changed the generated Dockerfile\nto use the canonical id (\"ynh run local/imaged\") and updated the\nunit test (cmd/ynh/image_test.go) accordingly, but this e2e test was\nmissed — it only runs on PR\n[…]\nl this release PR.\n\n\nClaude-Session: https://claude.ai/code/session_01CqHvTLYs2i4yawimQaLKgj\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Sonnet 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(e2e): update image dry-run test for canonical run-dir entrypoint …",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-07-17T20:59:05Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "bdf331558f18929ff4c0f6bc1e6f8d85d36f8086",
"body": "Registry harnesses report version_available from marketplace.json's\nmaintainer-authored version string, independently of sha_available\n(a live ls-remote against the underlying source). Nothing validates\nthe two against each other, so a stale marketplace.json entry could\nreport version_available lowe\n[…]\nother.\n\nFixes #177\n\n\nClaude-Session: https://claude.ai/code/session_01CqHvTLYs2i4yawimQaLKgj\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Sonnet 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(ls): clamp stale version_available when SHA shows no drift (#180)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-07-17T20:42:20Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f79758b63c594df03c81af6d732f3cd9e4b63507",
"body": "Plugins authored Claude-first declare MCP servers via a root\n.mcp.json (Claude Code convention) instead of mcp_servers in\n.ynh-plugin/plugin.json. ynh only ever read the manifest key, so\nthose servers were silently dropped — ynh info showed none, and\nnon-Claude vendor adapters composed harnesses wit\n[…]\nopped.\n\nFixes #178\n\n\nClaude-Session: https://claude.ai/code/session_01CqHvTLYs2i4yawimQaLKgj\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Sonnet 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(plugin): ingest root .mcp.json as MCP server fallback (#179)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-07-17T20:22:43Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a84d4f401b2f9c14457a89fe56c42f8e8ced683c",
"body": "…lobber each other (#174)\n\nRun dirs were keyed by bare harness name, so two installs sharing a leaf\nname (e.g. \"local/foo\" and \"github.com/org/repo/foo\") assembled into the\nsame ~/.ynh/run/foo — AssembleTo's clean-previous-run RemoveAll wiped the\nother install's assembled layout, including out from \n[…]\n id-keyed paths; T09's bare-name \"ynh image\" commands\n fixed to canonical ids.\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(run): key run dirs by canonical id so same-named installs can't c…",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-06-04T11:54:05Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "83823823fa9e35298ecdc0e38267f471d8a03a2f",
"body": "…ll (#173)\n\nLaunchers (~/.ynh/bin/<name>), run dirs (~/.ynh/run/<name>) and sources\nentries are keyed by bare harness name, but installs are identified by\ncanonical id. Uninstalling one of two same-named installs (e.g.\n\"local/foo\" alongside \"github.com/org/repo/foo\") unconditionally removed\nthe shar\n[…]\nl don't suppress cleanup. Last uninstall of a name cleans up\nexactly as before.\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(uninstall): preserve bare-name resources claimed by another insta…",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-06-04T07:38:08Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "1ca2a949a7b79c8a4adf5baa59349b96f4dfcffa",
"body": "…, path anchoring (#172)\n\nAddresses the code-side findings from the sensor/hook field bug report:\ngetting YNH-declared hooks to fire (and feed verdicts back) in a normal\n`claude` session, where plugin-dir hooks don't auto-activate.\n\nFinding 7.1 — path anchoring (internal/vendor/claude.go):\nGenerateH\n[…]\ns the eval suite.\n\nNo --format json response shape changed; no capability bump.\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(hooks): wire sensors into plain Claude sessions — export, doctor…",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-06-04T07:24:57Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "fc1f73dcc454c7abfc6eef04aa50586e27deb9f3",
"body": "Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 6 to 7.\n- [Release notes](https://github.com/docker/build-push-action/releases)\n- [Commits](https://github.com/docker/build-push-action/compare/v6...v7)\n\n---\nupdated-dependencies:\n- dependency-name: docker/build-push-\n[…]\nirect:production\n update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "ci: bump docker/build-push-action from 6 to 7 (#169)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-06-04T07:23:20Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ae06d0b1fc6b9147cfc1113ecdd35c65a6ce7836",
"body": "…loyment (#171)\n\nField bug report found that YNH's hook docs misframe Claude's on_stop\nbehavior and omit the only deployment path that makes hooks fire in a\nplain Claude session. Pure docs changes; no code or assembled output\naffected.\n\nhooks.md:\n- Fix the on_stop canonical-events row: Claude's Stop\n[…]\ny-harness) missed by the canonical-id sweep in #130.\n Unblocks the eval suite.\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(hooks): correct on_stop semantics and document settings.json dep…",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-25T07:23:54Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "68bc36441fbee3afe3be0637494648c304497e48",
"body": "* docs(rules): land capability-bump rule for structured CLI output\n\nPhase 0 of the published JSON schemas plan. Codifies when\nconfig.CapabilitiesVersion must bump (remove/rename/narrow/tighten) vs\nwhen it doesn't (add optional, add open-set enum member, relax). Adds\nGate 4 to pre-remote.md so the ru\n[…]\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(schema): published JSON schemas for ynh CLI output (#166)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-13T19:16:32Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0d5e1fcdaafbba78e169144f9bae8b8a012cfa21",
"body": "Brings the release-branch merge commit (which absorbed main → release\nconflicts during v0.4.0 promotion) back to develop. Fast-forward — no\nnew content. Required by the stable release procedure.",
"is_bot": false,
"headline": "chore: back-merge release/v0.4.0 into develop (#165)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-13T07:21:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "57f8b0e13f2c9f172373ec360299081ff957130b",
"body": "# Conflicts:\n#\tcmd/ynh/fork.go\n#\tinternal/harness/editor.go\n#\tinternal/harness/editor_test.go\n#\tinternal/harness/pointer.go\n#\ttest/e2e/delegate_test.go",
"is_bot": false,
"headline": "Merge remote-tracking branch 'origin/main' into release/v0.4.0",
"author_name": "David Collie",
"author_login": null,
"committed_at": "2026-05-13T07:13:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8f3ba7be3dd34b0c7411a85085f34d1b3bac02bc",
"body": "Add E2E tests for ynd-side focus handling and ynd fmt edge cases —\ntwo surfaces only thinly covered before 0.4.0.\n\nynd_focus_test.go — exercise --focus on ynd preview/diff/export\n - TestYnd_Preview_WithFocus profile-resolved hook content\n appears in \n[…]\np,\n including the profile-removal path that depends on the binding being gone.\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "test: expand E2E coverage for 0.4.0 surface (#163)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-13T06:43:04Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "5c54f0ea9757208390807f24d6c3a2e2675ca525",
"body": "Fill direct unit-test gaps in the largest packages affected by recent\nwork (PR #160 editing commands, PR #158 schema-3 pointers).\n\ninternal/harness 48.5% → 84.5%\n - focus_profile_test: AddFocus/RemoveFocus/UpdateFocus + AddProfile/\n RemoveProfile, including focus→profile reference blocking\n - \n[…]\ns, git, or the network\nand are exercised through the E2E suite, not unit tests.\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "test: expand unit coverage for 0.4.0 surface (#162)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-13T06:41:00Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "c77355c9a3f94e2e6f746bc745fda2cad1e20e3c",
"body": "Bring reference docs and tutorial chain in line with PR #160 (focus and\nnew editing commands) and the current _sidebar ordering.\n\n- reference.md: add YNH_FOCUS env var, --focus on ynh run / ynd\n preview/diff/export, focus priority rule\n- ynd.md: document --focus on preview, diff, export + Common Op\n[…]\nure blurb mentions focus and CLI editing surface; update\n tutorial count to 18\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: prep for 0.4.0 release (#161)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-13T06:40:56Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "eb947848c93f21d4529684f83c5a81e6b6175a40",
"body": "* feat(ynh): focus and profile editing commands\n\nAdds CRUD primitives for the two remaining harness resources that lacked\nCLI mutation paths, completing the surface that interactive consumers\n(notably TermQ's Harness Detail pane) need to drive end-user\nconfiguration of installed harnesses.\n\nNew ynh \n[…]\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(ynh): focus, profile, hook, and mcp editing commands (#160)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-12T22:59:36Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "aaff6423a781c7f3c0a5ce8b0affef98d78ee3bd",
"body": "…#159)\n\n`ynh ls` loaded each row's harness via `LoadByID(\"local/\" + e.Name)`,\nignoring the entry's namespace. When a leaf name existed as both a\nlocal-fork pointer and a tree-form registry install, the schema-1\npointer matched for both rows — stamping fork-shaped id/kind/source\nonto the registry ent\n[…]\ntest.go covering JSON and text\noutput for the fork + registry coexistence case.\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(ls): derive load id from entry namespace, not hard-coded local/ (…",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-12T18:54:02Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "4c4feaebce04511753b3795170c9217cb76235db",
"body": "…try (#158)\n\n* refactor(harness): introduce IsLocalSource helper and topology doc\n\nCentralises the source_type ∈ {local,source} && source != \"\" check\nused by ResolveEditTarget — the same predicate that the rest of this\nPR will route reads and migration through.\n\nThe doc in topology.go names the two \n[…]\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(harness): schema-3 pointer-form local installs — read/write symme…",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-12T17:51:54Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "efff4acc355194cd26d1fc92b2a9d706554f6052",
"body": "## Summary\n\n- Cherry-picks `--instructions` flag (#152) onto v0.3.1 — injects\nper-invocation context into vendor pipeline after harness content\n- Cherry-picks `-trimpath` goreleaser CI fix (#156)\n\n## What's new\n\n`ynh run <harness> --instructions \"<text>\"` injects runtime context (PR\nnumbers, ticket \n[…]\ned from develop: `ynh agent run` (saving for 0.4.0 minor).\n\n## Quality gates\n\n- `make check`: PASS\n- Evals: PASS (8 tutorials, 30 cases)\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)",
"is_bot": false,
"headline": "hotfix: v0.3.2 — add --instructions flag (#157)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-12T08:24:06Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "dedc3fe49264f8332b361411f71b117ef5bcbc01",
"body": "Removes embedded absolute build paths from the gopclntab section,\nreducing binary size by ~5% and improving build reproducibility.\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "ci(release): add -trimpath to goreleaser build flags (#156)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-12T08:08:12Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "7883a08d13a07d243eecc8795e422112716b3a51",
"body": "…on (#152)\n\nCallers (e.g. TermQ Remote PRs) need to pass runtime context — which PR\nis being reviewed, which ticket a session relates to — into a harness\nsession without modifying the harness definition. The existing vendor\nflag passthrough technically reaches Claude via --append-system-prompt,\nbut \n[…]\nrface so vendor logic\nstays encapsulated. Tests cover all three adapters and parseRunArgs.\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(run): add --instructions flag for per-invocation context injecti…",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-12T08:08:12Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "ac30d22a5f4cd5016d33d77fd0f89dea7a7752f3",
"body": "Removes embedded absolute build paths from the gopclntab section,\nreducing binary size by ~5% and improving build reproducibility.\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "ci(release): add -trimpath to goreleaser build flags (#156)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-12T06:10:55Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "40c1b3724d1a6641b2bc3bd71e1698a1e1eaab70",
"body": "* fix(e2e): use HTTPS URLs and bump AssistantsFixturesSHA to eeb5108\n\nFixtures in eyelock/assistants now store HTTPS URLs instead of\nshorthand (github.com/...) which ynh normalized to SSH — breaking\nthe E2E suite in CI where no SSH deploy key exists.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthr\n[…]\ns loader (#150). Includes E2E test alignment for the source-dir routing change.\n\n---------\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: forward-port v0.3.1 hotfix to develop",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-12T05:45:17Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "bee32ac850497ae7c66c5c9ba2025e88ee453ae4",
"body": "* feat(agent): add ynh agent run loop driver (Phase 1)\n\nImplements the Phase 1 loop driver as `ynh agent run`, embedding\nit in the ynh binary per the agent-loop plan. The loop driver is\nthe missing orchestration layer that sits above ynh's sensor\nexecution: it spawns a vendor agent subprocess, runs \n[…]\nnd trailing newline.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(agent): ynh agent run — autonomous agent loop driver (#154)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-12T05:45:10Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "1a200b895d77b007d197c65322e0f3d8834c7ef4",
"body": "Cherry-picks two fixes from develop: route include/delegate edits to source dir for local installs (#149), and remove dead code/stale comments from harness loader (#150). Includes E2E test alignment for the source-dir routing change.",
"is_bot": false,
"headline": "fix(harness): hotfix 0.3.1 — source dir routing and dead code removal",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-12T05:43:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ff8b8e1f9d0bbc76e509d43cd7cfe51d2a3cac4c",
"body": "…on (#152)\n\nCallers (e.g. TermQ Remote PRs) need to pass runtime context — which PR\nis being reviewed, which ticket a session relates to — into a harness\nsession without modifying the harness definition. The existing vendor\nflag passthrough technically reaches Claude via --append-system-prompt,\nbut \n[…]\nrface so vendor logic\nstays encapsulated. Tests cover all three adapters and parseRunArgs.\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(run): add --instructions flag for per-invocation context injecti…",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-11T17:52:57Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "31674cd2ce180441492fcf6e7778bb2c203200bd",
"body": "…stalls (#149)\n\n* fix(harness): route include/delegate edits to source dir for local installs\n\nResolveEditTarget was returning the registry copy (~/.ynh/harnesses/<id>/)\nfor all canonical-id refs, even when installed.json recorded source_type=local.\nThis meant include add/remove/update and delegate \n[…]\n to cover this path.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(harness): route include/delegate edits to source dir for local in…",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-11T16:40:12Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "61552ddb1dcb007b81467c5387221d9051fe2824",
"body": "…ry dead code and fix stale comments (#150)\n\n- Remove harness.Load() and its helper findInNamespacedDirs() — no production\n callers since the canonical-id cutover; all commands use LoadQualified/LoadByID\n- Remove harness.ScanArtifacts(name) — dead wrapper around ScanArtifactsDir; tests\n updated to\n[…]\nd was called (it's LoadQualified)\n- Fix stale comment in pointer.go referencing Load(name)\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(harness): remove bare-name Load/ScanArtifacts/formatArtifactSumma…",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-11T15:34:32Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "316d06cce3a8bd51556167c2e84a42f800708509",
"body": "* fix(e2e): use HTTPS URLs and bump AssistantsFixturesSHA to eeb5108\n\nFixtures in eyelock/assistants now store HTTPS URLs instead of\nshorthand (github.com/...) which ynh normalized to SSH — breaking\nthe E2E suite in CI where no SSH deploy key exists.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthr\n[…]\nfests automatically.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: sync main → develop after v0.3.0 release (#148)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-11T08:32:08Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "08300a25d5cd4360bee90cf59b817ee5930894f7",
"body": "Removes invalid skip value — only `--skip=docker` is needed. Unblocks\nv0.3.0 re-release.",
"is_bot": false,
"headline": "ci(release): fix goreleaser --skip=docker_manifests invalid flag (#147)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-11T08:28:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7b41cc164b31f287c7c0bcb60e5a41c46ef1407a",
"body": "Only --skip=docker needed; goreleaser handles manifests automatically.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "ci(release): fix goreleaser --skip flag — docker_manifests is invalid",
"author_name": "David Collie",
"author_login": null,
"committed_at": "2026-05-11T08:26:50Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "28671327926cb5f342b5aefadd09877cec136b06",
"body": "Binary release (goreleaser) now completes in ~2 min. Docker multi-arch\nbuild runs after in its own job. Unblocks v0.3.0 re-release.",
"is_bot": false,
"headline": "ci(release): split Docker into separate post-release job (#146)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-11T08:19:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dd7e30ec555191a29049a11229fe9b7fba51bc5a",
"body": "Binary release (goreleaser) now completes in ~2 min, unblocked from\nthe ~60 min Docker multi-arch build. Docker job runs after release\nvia docker/build-push-action and creates the multi-arch manifest.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "ci(release): split Docker into separate post-release job",
"author_name": "David Collie",
"author_login": null,
"committed_at": "2026-05-11T08:16:50Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "61049234beca81b31f23936c766b93a956ac1f50",
"body": "Docker multi-arch build takes ~60 min, hitting goreleaser's 1h default.\nUnblocks v0.3.0 release.",
"is_bot": false,
"headline": "ci(release): increase goreleaser timeout to 90m (#145)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-11T08:15:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "508c3bbecffacb8343e08bb5dfd6596ab76d6be0",
"body": "Docker multi-arch build takes ~60 minutes, hitting the default 1h\ngoreleaser timeout. 90m gives enough headroom.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "ci(release): increase goreleaser timeout to 90m",
"author_name": "David Collie",
"author_login": null,
"committed_at": "2026-05-11T08:07:58Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "a516bb5ac1dd1ed4b5466ef859ea57bdeae5b884",
"body": "Promotes release/v0.3.0 to main for stable release.",
"is_bot": false,
"headline": "release: v0.3.0 (#144)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-11T07:05:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "723f0957613b11b14a0d368f8fa933f9de356be7",
"body": "Picks up HTTPS URL fix for Jeffallan/claude-skills include in\nynh/ynh-dev (eyelock/assistants#21), resolving the final E2E failure.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(e2e): bump AssistantsFixturesSHA to cbc4730",
"author_name": "David Collie",
"author_login": null,
"committed_at": "2026-05-11T07:03:49Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "dd912ad702d616b63f3832fd74a3ed65e17929b5",
"body": "Picks up HTTPS URL fix for ynh/ harness manifests (eyelock/assistants#20),\nresolving the remaining TestSmoke_LiveAssistants E2E failure.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(e2e): bump AssistantsFixturesSHA to adf587e",
"author_name": "David Collie",
"author_login": null,
"committed_at": "2026-05-11T06:56:06Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "f814acd515b7167fcf1a4cde6f354b4a4dac4ed4",
"body": "Fixtures in eyelock/assistants now store HTTPS URLs instead of\nshorthand (github.com/...) which ynh normalized to SSH — breaking\nthe E2E suite in CI where no SSH deploy key exists.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(e2e): use HTTPS URLs and bump AssistantsFixturesSHA to eeb5108",
"author_name": "David Collie",
"author_login": null,
"committed_at": "2026-05-11T06:43:47Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "ab23baea4a4715555c4ff5effa8e5747446f80ec",
"body": "…lp text (#143)\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(run): document --focus, --profile, and --interactive flags in he…",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-09T16:10:44Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "a4a68982dcee8452ffc2b79b9322378ccbd71c9d",
"body": "* feat(run): add --interactive flag for focus-seeded interactive sessions\n\nAdds LaunchWithInitialPrompt to the Adapter interface and implements it\nfor all three vendors (Claude, Codex, Cursor) using the positional-arg\npattern documented in each vendor's CLI reference. The --interactive flag\non ynh r\n[…]\nppend-system-prompt.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(run): add --interactive flag for focus-seeded sessions (#142)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-09T15:35:09Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "727ece6056056a3347060b1f2476c229fd33b26a",
"body": "…(#141)\n\nDelegate E2E tests (TestDelegate_AddRemove, TestDelegate_Update) were\npointing at e2e-fixtures/included-skill, which has no plugin manifest.\nPR #134's validateDelegateTarget requires a valid harness, so both tests\nwere failing. Switched to e2e-fixtures/fork-source, which is a proper\nharness\n[…]\nand idempotent re-run paths. Coverage of\ninternal/migration/canonicalid.go: 49.7% → 68.6%.\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "test(e2e): fix delegate fixture path and add migrateOneInstall tests …",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-09T10:48:27Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e7f56283d9e838bc254b32ddc6d9ec805ce81ad3",
"body": "… (#140)\n\nAdd 38 tests covering migrateOneInstall, migrateFlatOrSchema2Install,\nmigrateInstallTrees, migrateNamespacedParent, isLegacyNamespacedParent,\ninstallExistsForLauncher, loadHarnessName, splitHostFromID, copyDir,\ncopyFile, and all Description() methods — all previously at 0%.\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "test(migration): raise internal/migration coverage from 50.6% → 80.5%…",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-09T10:37:48Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "a6a2cdecdc3fc7eacf2eb1898d580b482604d19d",
"body": "A fork (local/<name>) and a registry install (<host>/…/<name>) that\nshare the same leaf name have distinct canonical ids. ListAll was keying\nits dedup map by bare name, so the registry tree was silently dropped\nwhenever a same-named pointer was present. The canonical-id work (#127)\nwas designed to a\n[…]\ncal tree that share the canonical id\n\"local/<name>\" are still deduplicated to the pointer.\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(list): key ListAll dedup map by canonical id, not bare name (#139)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-09T08:19:28Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "71cb292e211cdf54e215266d9b312a548dae602f",
"body": "… (#138)\n\n* fix(uninstall): resolve local/ pointer IDs and tag broken forks in ls\n\nTwo issues surfaced via TermQ's Uninstall menu:\n\n1. ynh uninstall local/<name> returned \"not installed\" for any fork\n created by ynh fork. The pointer lookup used LoadPointer(ref)\n directly, so \"local/my-fork\" was\n[…]\nion went\nundetected.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(uninstall): resolve local/ pointer IDs and tag broken forks in ls…",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-09T07:54:06Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "94fee0c32c13a819378f226650974365373fff43",
"body": "…(#137)\n\n* feat(plugin): rename top-level JSON key focus → focuses\n\nThe manifest field was tagged json:\"focus\" but the documented and\nexpected format uses \"focuses\". Because LoadPluginJSON uses\nDisallowUnknownFields, any plugin.json with a \"focuses\" key was\nrejected. Rename the tag to match the publ\n[…]\nition decoder reads.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(plugin): expose focuses field — rename JSON key focus → focuses …",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-08T21:27:29Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "17b8f4fd5fd8479297e7a892dab3dcd08f38a3c7",
"body": "…back (#136)\n\nynh fork writes pointer files as <name>.json (schema-1 name-keyed).\nLoadByID and ResolveEditTarget only consulted schema-2 id-keyed files\n(local--<name>.json), so any command that resolved a harness by canonical\nid (ynh info, include update/add/remove, delegate add/update/remove) retur\n[…]\nh existing on-disk schema-1 pointers and\nany new ones written by the current fork command.\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(harness): resolve local/ pointer IDs via schema-1 name-keyed fall…",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-08T20:15:07Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0e9632b0aa59df2df23395132cc390fb895afce3",
"body": "…ntom SHA (#135)\n\n* fix(update): count updated when cache is ahead of ref_installed\n\nWhen the local git cache was advanced by a different operation (e.g.\nanother harness update fetching the same URL), EnsureRepo returns\nChanged=false even though installed.json still records the old SHA.\nThe SHA was \n[…]\nadow/main\" branches.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(resolver): LsRemoteFunc exact-ref match prevents suffix-match pha…",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-08T19:29:12Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a7fe07fe1d3656acb454d63a488ae2515a03ad71",
"body": "…uous, and auto-resolve single-subdir (#134)\n\nAdds validateDelegateTarget to check that the resolved git source\ncontains exactly one harness manifest. Gives an actionable error when\nthe target has no manifest, and prompts --path when multiple harnesses\nare found. Auto-records the subdir path when only one harness lives in\na subdir of the repo root.\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(delegate): validate harness target on add — reject missing, ambig…",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-08T17:07:39Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "2d0c1a7d0e76252e0aa3cd4ccaefe3f3c71a94fb",
"body": "The schema already rejects `local` on `delegates_to` entries (DisallowUnknownFields), but the limitation was undocumented. Add a CONTRIBUTING.md section explaining the reasons (portability, identity, post-install path resolution) and a pointer from the CLI reference.\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: document delegates as remote-only (#133)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-08T16:39:17Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "a82a95aa79da778c75c5fd6c92b653afd4d83913",
"body": "* docs: clarify ref/sha contract for marketplace and delegates\n\nDocuments the existing model — `ref` is the primary identifier, `sha`\nis an optional integrity pin layered on top — across CONTRIBUTING.md,\nmarketplace docs, tutorial 7, and a new integration note for downstream\ntools (delegate UIs, das\n[…]\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: clarify ref/sha contract for marketplace and delegates (#132)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-08T13:43:32Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f09f0b64b2fd7c010639e0716a9532aa07c934e6",
"body": "Concurrent ynh invocations on the same cache entry (e.g. a TUI firing\nmultiple ynh processes for harness list refresh + install dialog\nregistry fetch in parallel) raced inside EnsureRepo and surfaced as:\n\n removing stale registry cache: unlinkat .../cache/<key>: directory not empty\n could not lock\n[…]\n+ linux only).\n\nAdd TestEnsureRepo_ConcurrentCallers_DoNotRace: 8 parallel callers\nagainst a local source repo, all succeed, cache stays consistent.\n\nCo-authored-by: David Collie <support@eyelock.net>",
"is_bot": false,
"headline": "fix(resolver): serialize concurrent cache access with file lock (#131)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-08T11:48:00Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "fae93ab1867d9290db7cbe663f6d4ba960937072",
"body": "* docs: canonical-id sweep across CONTRIBUTING.md and 13 tutorials\n\nPR-canonical-5, the final docs cleanup of the canonical-id workstream.\nUpdates every user-facing reference that lagged the resolver flip and\nadds the developer-facing contract documentation.\n\nCONTRIBUTING.md\n- New Harness Identity s\n[…]\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: canonical-id sweep across CONTRIBUTING.md and 13 tutorials (#130)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-05T19:45:37Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "fca98995f962b8bd6b8256f2c3d34e3310880c88",
"body": "…po (#129)\n\nynh install <canonical-id> with a four-segment id (e.g.\ngithub.com/eyelock/assistants/researcher) cloned the repo correctly\nbut discarded the trailing \"researcher\" segment. The result was\ninstalled under a synthesized name from the cache hash, with a\ncanonical id that didn't round-trip b\n[…]\n reports\nid=github.com/eyelock/assistants/researcher, and ynh info round-trips.\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(install): canonical id name segment selects sub-harness in monore…",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-05T19:21:25Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "1d679bbe9e890763d18a0a4739050c0a1fbaf8b0",
"body": "…#128)\n\n* feat(quarantine): ynh quarantine subcommands and launcher migration\n\nPR-canonical-4 of the canonical-id workstream. Adds the user-facing\nsurface for quarantined entries that schema-2 migration couldn't\nconvert (introduced in PR-2 / PR-3) and rewrites legacy launcher\nscripts to invoke `ynh \n[…]\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(quarantine): ynh quarantine subcommands and launcher migration (…",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-05T18:45:42Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "2b585e1e78acc53281d039e5c5f5acb1c983ed96",
"body": "…s 0.4.0 (#127)\n\n* feat(resolver): canonical-id cutover — reject bare names, capabilities 0.4.0\n\nPR-canonical-3 of the canonical-id workstream. The resolver flips to\nhard-reject bare names and the legacy \"name@org/repo\" form. cmdInstall,\ncmdRun, cmdUpdate, cmdImage all use canonical ids end-to-end. \n[…]\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(resolver): canonical-id cutover — reject bare names, capabilitie…",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-05T18:16:48Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "68837429c225d5f2fb3951645b9c5cfdb84d7d19",
"body": "* feat(migrate): schema 2 migration infrastructure and ynh migrate command\n\nPR-canonical-2 of the canonical-id workstream. Lands the migration\nmachinery for converting ~/.ynh from schema 1 (name-keyed pointers,\nhost-stripped namespaces) to schema 2 (id-keyed pointers, canonical\nids stamped into inst\n[…]\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(migrate): schema 2 migration infrastructure (#126)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-05T12:34:43Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "c62d5ed6585817d7b12527d159898313e8f24284",
"body": "…(#125)\n\n* feat(envelope): add canonical id and schema_version to harness envelopes\n\nls, info, and search --format json now emit a per-entry id field\nalongside name and namespace, plus a top-level schema_version sibling\non the envelope. id is the path-shaped canonical harness identifier\n(\"<host>/<or\n[…]\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(envelope): canonical id and schema_version on harness envelopes …",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-05T09:18:48Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "34ed93022ad9551dcbe87732d631d58760d2b01e",
"body": "git clone --depth 1 can intermittently fail with \"shallow file has\nchanged since we read it\" or stale .lock files when its internal state\nraces against the just-written shallow file or a prior interrupted run.\nOn a fresh ynh search (no prior cache), this surfaced to consumers as a\nhard failure even \n[…]\nn-transient errors (e.g.\nrepository not found) still fail fast without a retry.\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(resolver): retry transient shallow-clone failures (#124)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-04T20:36:40Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "274f023ff497f3b7a84e7131260b2ce5044190ce",
"body": "Adds an \"Envelope shape\" section to docs/cli-structured.md covering\nthe two top-level JSON shapes ynh emits, which commands use which,\nand why. Resolves a documentation gap raised by a downstream consumer\nafter the v0.3.0 envelope change on ls/info/fork.\n\nThe convention codified:\n- Envelope (capabil\n[…]\nLocks the convention so envelope drift\nfails CI rather than reaching consumers.\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(cli-structured): document envelope vs bare-value convention (#123)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-04T16:38:17Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "7deb2bb4239cfb460de6b4105356659ee69b801c",
"body": "* fix(ls,search): emit namespace field in JSON output\n\nynh ls and ynh search were collecting namespace internally but\ndropping it in the output DTOs. Registry installs derive a namespace\nfrom the URL (eyelock/assistants), the install path stamps it onto\ninstalled.json, and ListAll/Harness load it ba\n[…]\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(ls,search): emit namespace field in JSON output (#122)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-03T09:49:51Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "5022061faca5d47f467067ae3423030861593b29",
"body": "* feat(sensors): schema, manifest model, and validation rules\n\nAdds the sensors top-level field to plugin.json — declares observation\nsurfaces a loop driver consumes between agent turns. ynh declares;\nthe loop driver runs.\n\n- Schema (docs + embedded copy): sensors map with strict one-of source\n (fi\n[…]\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(sensors): declare observation surfaces (v0.3.0) (#108)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-03T08:39:18Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "4e674e926155e8d3652ae0b86bd18c6cb3b68ea9",
"body": "* feat(e2e): scaffold E2E test suite (Phase 1)\n\nAdds the foundation for a real end-to-end test suite that asserts deep\nfilesystem state against SHA-pinned fixtures in eyelock/assistants —\naddressing the category gap where tutorial-driven evals can't verify\ncodepaths they don't exercise (e.g. SHA per\n[…]\nssues, all unit + race + cover tests pass\n- make e2e: 102 tests pass against the new pinned SHA\n- /evals: PASS (18 tutorials, 0 failures)\n\n---------\n\nCo-authored-by: David Collie <support@eyelock.net>",
"is_bot": false,
"headline": "feat(e2e): full E2E test suite (~100 tests, ~1m wallclock) (#121)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-02T14:38:55Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5a6c1e4c4bebc201a2093373f5666d7a263ee043",
"body": "ynh uninstall failed with \"not installed\" when a fork pointer existed\nbut its source tree was missing — exactly the case where users most\nneed to uninstall. cmdUninstall now checks for a pointer first and\ntakes the pointer-removal path without loading the manifest, so a\nmissing source no longer bloc\n[…]\n the source dir without\nuninstalling first\" without hand-editing the YNH layer.\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(uninstall,prune,ls): clean up orphan fork pointers (#120)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-01T23:34:28Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "68bf7366108b5fa7cd10e815c15f531f92313d64",
"body": "…e (#119)\n\nynh fork now writes ~/.ynh/installed/<name>.json registering the fork\nunder YNH without copying. Edits to the source tree are live to ynh run;\nno second ynh install step. Pointer wins over tree-shaped installs in\nharness.Load() so the registration takes precedence over any same-named\nflat\n[…]\nwned source tree.\n\nPre-1.0 migration: existing two-tree forks (created via the old ynh\nfork + ynh install pattern) keep working. Re-fork to convert.\n\nCo-authored-by: David Collie <support@eyelock.net>",
"is_bot": false,
"headline": "feat(fork): self-register forks via pointer file, add --name to renam…",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-01T22:43:12Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ecf840047247921607170d9a39a010b8bc57be8a",
"body": "ynh fork <name> recomputed a flat install path (harnesses/<name>) instead\nof using the directory the lookup actually resolved, so registry installs\nunder namespaced paths (harnesses/<ns--repo>/<name>) failed with\n\"no such file or directory\".\n\nUse the resolved p.Dir from the loaded harness for both t\n[…]\nambiguate with name@org/repo when two registries publish\nthe same harness name.\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(fork): resolve namespaced installs via loaded harness Dir (#118)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-01T21:14:25Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "31eb383deb79eda75f46851b10d851495ea266d1",
"body": "* fix(harness): probe the ref ynh update tracks, not the upstream default\n\nFor includes/delegates without an explicit manifest ref, the local cache\npins origin/HEAD at clone time and never auto-updates when upstream\nchanges its default branch. ynh update correctly follows that pinned\nref; --check-up\n[…]\ned from\n base.SHAAvailable in printInfoJSON.\n\nVerified against the live termq-dev and gitflow installs without\nrunning ynh update first.\n\n---------\n\nCo-authored-by: David Collie <support@eyelock.net>",
"is_bot": false,
"headline": "fix(harness): correct drift signals for harness-level updates (#117)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-01T20:42:06Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b5980f5dc11807f9a1383e60893a39ff0d49222a",
"body": "Several sections of CONTRIBUTING.md still described the legacy\n`.harness.json` single-file format as the install/runtime format. Actual\ninstall path is the directory-form manifest at `.ynh-plugin/plugin.json`\nwith a separate `.ynh-plugin/installed.json` for provenance.\n\nThis caused recurring confusi\n[…]\nied `--harness-file` still accepts legacy via `LoadFile` →\n`LoadHarnessFile` (`internal/harness/harness.go:506`)\n- Verified auto-discovery migrates then loads via `IsPluginDir`\n(`cmd/ynh/main.go:619`)",
"is_bot": false,
"headline": "docs(contributing): correct harness-manifest format references (#116)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-05-01T19:58:35Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d4c286907b2b52b8047c50954380f5085a79959c",
"body": "The Harness Manifest, Resolution Order, Install Lifecycle, and Directory\nStructure sections still described the legacy .harness.json single-file\nformat as the install/runtime format. The actual install path is the\ndirectory-form manifest at .ynh-plugin/plugin.json with a separate\n.ynh-plugin/install\n[…]\nolved[] slice\n- Directory tree: corrected to show .ynh-plugin/ subdirectory contents\n- Legacy .harness.json references retained only where genuinely accurate\n (--harness-file flag, migration mention)",
"is_bot": false,
"headline": "docs(contributing): correct harness-manifest format references",
"author_name": "David Collie",
"author_login": null,
"committed_at": "2026-04-30T07:07:28Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7cb24ffc1c59d6e59aedc167a6f30623481d31bc",
"body": "Closes #113.\n\nFloating-ref includes had no place to record their resolved commit SHA,\nso `ref_installed` came back empty in `--check-updates` JSON output and\ndownstream consumers (TermQ) couldn't detect drift.\n\n## Changes\n\n- `resolver.RepoResult` now exposes the resolved `SHA` after\nfetch/checkout\n-\n[…]\nme>` after upgrade backfills.\n\n## Verification\n\n- `make check` green: lint 0, race-clean tests, both binaries build,\n`internal/harness` coverage 78.7% → 79.2%\n- `/evals` PASS: 18 tutorials, 0 failures",
"is_bot": false,
"headline": "fix(harness): record resolved SHA per include/delegate (#115)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-04-30T06:28:01Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "dea36caeef8d1849c5fff73cc0ec03aa52466ba6",
"body": "Closes #113.\n\nFloating-ref includes (no manifest pin or branch/tag pin) had no place\nto record their resolved commit SHA, leaving ref_installed empty in\n--check-updates output and breaking downstream update detection.\n\n- Capture HEAD SHA in resolver.RepoResult after fetch/checkout\n- Record per-sourc\n[…]\nobe logic uses the manifest IsPinned signal directly instead of\n re-classifying RefInstalled (now a SHA, not a fetchable ref)\n\nPre-migration installs work without changes; first ynh update backfills.",
"is_bot": false,
"headline": "fix(harness): record resolved SHA per include/delegate",
"author_name": "David Collie",
"author_login": null,
"committed_at": "2026-04-29T23:15:30Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f6b8746c8a4a0b861a26ea2bcc370b51a59551c9",
"body": "Topology-only `-s ours` merge. develop already contains main's content\nvia #111's squash; this advances the merge-base so future main→develop\nsyncs don't re-conflict on the same 13 files.\n\nTree is identical to develop. CI should be a no-op.\n\n**Merge with a regular merge, not squash** — squashing here destroys the\ntopology this PR exists to record.",
"is_bot": false,
"headline": "chore: record main as merged into develop (#112)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-04-29T23:05:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9920131733dcaec65dc84810e9a23b32f2d96f02",
"body": "Topology-only merge. develop already contains main's content via the\nsquash of #111; this advances the merge-base so future main→develop\nsyncs don't re-conflict on the same files.",
"is_bot": false,
"headline": "chore: record main as merged into develop",
"author_name": "David Collie",
"author_login": null,
"committed_at": "2026-04-29T23:04:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8696d12306e40b314adfe2f79e145750a509986d",
"body": "* fix: ynh search with no query arg lists all harnesses (#55) (#56)\n\n* fix: ynh search with no query arg lists all harnesses\n\nPreviously `ynh search` (no query) returned an error requiring callers\nto pass an explicit empty string `\"\"`. Now a missing query is treated as\n\"list all\" — matching all entr\n[…]\nur calls explicitly for clarity but the semantic\n contract now has a named home.\n\n- Adds TestArtifactTypes_SchemaAgreement: loads docs/schema/plugin.schema.json,\n extracts the pick.items.pattern, a…",
"is_bot": false,
"headline": "chore: sync main (v0.2.3) into develop (#111)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-04-29T23:03:17Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "58889ed60c821379feaa1e165da7748334237c32",
"body": "…#110)\n\nMarketplace entries that pinned a Git ref via source.ref were silently\ninstalled from the source repo's default branch. The schema and docs\nboth advertised ref/sha as supported pinning fields, but registry.Entry\nhad no ref/sha fields, LoadFromDir dropped them, and cmdInstall called\nEnsureRep\n[…]\n rejected pre-copy.\n- image --dry-run resolves through registry and honors ref.\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(registry): honor entry-level ref and sha pins on install (#109) (…",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-04-29T18:02:34Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "26d8263c14339e637b93b95d2df8edc8ebff5f23",
"body": "Marketplace entries that pinned a Git ref via source.ref were silently\ninstalled from the source repo's default branch. The schema and docs\nboth advertised ref/sha as supported pinning fields, but registry.Entry\nhad no ref/sha fields, LoadFromDir dropped them, and cmdInstall called\nEnsureRepo with a\n[…]\n rejected pre-copy.\n- image --dry-run resolves through registry and honors ref.\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(registry): honor entry-level ref and sha pins on install (#109)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-04-29T17:46:13Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "6d69c16eacccd097a659d87aabd67dcd51a438e0",
"body": "…) (#107)\n\ninclude add/remove/update and delegate add/remove/update failed with\n\"harness not found\" for any harness installed under a namespace\nsubdirectory. ResolveEditTarget only checked the flat InstalledDir path;\nit now falls through to findInNamespacedDirs, matching the behaviour\nof Load.\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(harness): ResolveEditTarget ignores namespaced install dirs (#106…",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-04-29T05:11:37Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "f3fd575378a42735e9dfde60cea655823b7c864e",
"body": "include add/remove/update and delegate add/remove/update failed with\n\"harness not found\" for any harness installed under a namespace\nsubdirectory. ResolveEditTarget only checked the flat InstalledDir path;\nit now falls through to findInNamespacedDirs, matching the behaviour\nof Load.\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(harness): ResolveEditTarget ignores namespaced install dirs (#106)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-04-29T05:08:41Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "8e3fce8fa19082091e981967f961bbf626b14bc1",
"body": "… by name (#104) (#105)\n\nHarnesses installed from a registry land at ~/.ynh/harnesses/<ns>--<org>/<name>\n(namespaced layout) but several commands recomputed the path using InstalledDir()\nwhich always returns the flat ~/.ynh/harnesses/<name> path, causing:\n\n- ynh ls --format json: wrong path, and dup\n[…]\n verification steps to Tutorial 18 so evals catch\nany future regression in this code path.\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: registry harnesses report wrong path in ls/info; uninstall fails…",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-04-28T22:07:41Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e8c7a6e16c84ad12ea27bfced3288be3fdd831e7",
"body": "… by name (#104)\n\nHarnesses installed from a registry land at ~/.ynh/harnesses/<ns>--<org>/<name>\n(namespaced layout) but several commands recomputed the path using InstalledDir()\nwhich always returns the flat ~/.ynh/harnesses/<name> path, causing:\n\n- ynh ls --format json: wrong path, and duplicate-\n[…]\n verification steps to Tutorial 18 so evals catch\nany future regression in this code path.\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: registry harnesses report wrong path in ls/info; uninstall fails…",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-04-28T22:00:31Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "87ea988b2ccffa25391edac02e5b4f693f928b9b",
"body": "… (#103)\n\nMoves the evals command from .claude/commands/evals.md to\n.claude/agents/evals.md so it runs as a subagent with a fixed\nmodel (claude-haiku-4-5-20251001), keeping eval costs low regardless\nof the parent session model.\n\nAdds explicit guidance on which tutorials are locally testable without\n\n[…]\nlows/claude-code-review.yml — the automated\nClaude Code Review CI job is no longer needed.\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "ci: promote evals to dedicated haiku agent, remove claude-code-review…",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-04-28T20:30:18Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a2da85814c6cd78e34cb80fd579ccd6a2f15cab0",
"body": "Adds `ynh delegate add|remove|update` to manage the delegates_to\nfield in a harness manifest. Mirrors the include command surface\nbut without --pick (delegates are whole harnesses, not artifact\nsubsets).\n\n- delegate add <harness> <url> [--ref <ref>] [--path <subpath>]\n Errors if the same url+path c\n[…]\nss targets to warm the resolver cache.\n\nTests: 15 editor-level tests + 14 CLI-level tests.\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(cli): ynh delegate add/remove/update commands (#102)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-04-28T20:23:19Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "269c19916f74fe9160527b8183c6f1e822cac559",
"body": "Adds `ynh fork <name> [--to <path>] [--format json]` — copies an\ninstalled harness to a local directory and writes installed.json\nmarking it as a local fork with forked_from pointing at the upstream.\n\n- Default --to is ./<name> in cwd; errors if destination exists\n- Preserves forked_from through ynh\n[…]\nrence.md updated with fork command, structured output\n section, and ynh fork output shape\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(cli): ynh fork command with forked_from provenance (#101)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-04-28T20:15:46Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "7b6a5bc2552362268d9ed3d91c09826d9ab80676",
"body": "Wires the --check-updates flag to real upstream lookups for\nversion_available and ref_available across harnesses and includes.\nProbes run concurrently with bounded fan-out (8 workers) so a\nmulti-include harness does not serialize the network. Per-probe\nfailures degrade silently — fields stay omitted\n[…]\n.md with a worked example\n(T16.11) that demonstrates the three-state rendering.\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(cli): live --check-updates probes for ynh info/ls (#100)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-04-28T17:54:17Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e60ab43997a43b881df68e012a7b2c1214e9c20d",
"body": "* docs: branch naming rule uses slashes\n\nThe codified rule said hyphens (feat-foo, fix-foo) but recent practice is\nslashes (feat/harness-management, feat/maven-integration). Updated the\nrule to match practice — and noted that release branches no longer exist\n(release is tag-driven, protect-main.yml \n[…]\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(cli): JSON envelope and provenance fields for info/ls (#99)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-04-28T17:08:12Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "ab42b24cc5c8af6a176128a84fc720e9242496dd",
"body": "* fix: ynh search with no query arg lists all harnesses (#55)\n\n* fix: ynh search with no query arg lists all harnesses\n\nPreviously `ynh search` (no query) returned an error requiring callers\nto pass an explicit empty string `\"\"`. Now a missing query is treated as\n\"list all\" — matching all entries fr\n[…]\nall fails and a retry immediately succeeds.\n\nFix: when git fetch fails with a \".lock\" error, remove the stale lock\nfiles (shallow.lock, index.lock) and retry the fetch once before\npropagating the err…",
"is_bot": false,
"headline": "release: v0.2.0 (#97)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-04-27T20:24:03Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "ae5f419ec8e44d42fa0798ee530fe00c9efb8841",
"body": "Co-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "ci: allow release/* branches to target main (#95)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-04-27T20:04:51Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "674d1da0c77cd2c0fe77da9bbf829e7a38a3c5f6",
"body": "…#94)\n\npickSet was built from full paths like \"skills/swift-lang\" but compared\nagainst bare names returned by ScanArtifactsDir (\"swift-lang\"), so every\npicked artifact was silently dropped. Prefix the bare name with its type\nwhen checking the set.\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(compose): pick filter now matches type/name paths from includes (…",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-04-27T19:51:45Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "6b69372c1fa2ea3200fba38ba8a9d8c61d4332d2",
"body": "* fix: ynh search with no query arg lists all harnesses (#55) (#56)\n\n* fix: ynh search with no query arg lists all harnesses\n\nPreviously `ynh search` (no query) returned an error requiring callers\nto pass an explicit empty string `\"\"`. Now a missing query is treated as\n\"list all\" — matching all entr\n[…]\n<support@eyelock.net>\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: merge main into develop to reconcile hotfix history (#92)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-04-27T19:10:27Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "3f2092f8e6b8456c89372dc154062bc27db63755",
"body": "…place.json (#89)\n\nynd validate was doing ad-hoc field checks that silently passed invalid\nconfigs. A correct marketplace.json using the schema-specified \"harnesses\"\nkey was failing with a confusing \"at least one entry is required\" error\nbecause the Go struct used \"entries\" — a contradiction that wa\n[…]\nbed (no network required)\n- Test fixtures added: testdata/schema-fixtures/{valid,invalid}/\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(validate): real JSON Schema validation for plugin.json and market…",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-04-25T09:15:32Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "5b930bc6d688ec6275b0dcbb0d5943caf8e1c72d",
"body": "…ace entries (#90)\n\nUser-controlled path values were joined directly into file system paths\nwithout sanitisation, allowing directory traversal attacks:\n\n ynh install github.com/org/repo --path \"../../etc/passwd\"\n includes: [{\"local\": \"../../../etc\", \"path\": \"passwd\"}]\n marketplace entries: {\"sour\n[…]\nketplace.schema.json to reject traversal\nsequences at the schema validation layer as well.\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(security): block path traversal in --path, includes, and marketpl…",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-04-25T08:53:07Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "309516057547f7f609cc22c89e6707bcfa88f606",
"body": "Fixes two bugs preventing deep discovery of harnesses:\n\n1. findHarnessRoots() only searched one level deep (os.ReadDir loop).\n Now uses filepath.WalkDir to recurse fully, skipping .ynh-plugin\n dirs and stopping at harness roots to avoid double-counting.\n\n2. ynd migrate required -r flag to recurs\n[…]\nnt which auto-recurse\n\nTested against nested harness structure (depth 2+) from bug report.\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: ynd validate and ynd migrate auto-recurse directories (#88)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-04-24T16:45:54Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "66048e169de64af13a467424723ddbb082697b90",
"body": "* feat: CapabilitiesVersion + version --format json\n\nAdds a wire-contract version constant (internal/config.CapabilitiesVersion)\ndecoupled from the release Version ldflag, so developer builds honestly\nreport the contract they support. Exposes it via `ynh version --format json`\nand `ynd version --for\n[…]\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: CapabilitiesVersion + version --format json (#87)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-04-23T13:52:57Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "db6fe305a165622dca7b146aaa99852615a7bec8",
"body": "* feat: profile-level includes and local-path include sources\n\nProfiles now accept their own includes[] array, appended to the base\nharness's includes when the profile is active. Combined with local-path\nincludes, this lets a single harness ship a \"user view\" by default and\nswap in a \"contributor vi\n[…]\ne field description.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: profile-level includes + local-path include sources (#86)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-04-22T22:24:15Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "06d8250e2f6bfe9e3333aef087440366635af4d8",
"body": "…ion (#85)\n\n- Ran ynd migrate on the repo root: .harness.json → .ynh-plugin/plugin.json\n- Removed pre-0.1 metadata.json (vestigial)\n- Moved commands/ynd-quality.md → .claude/commands/ynd-quality.md\n (dev-only tool; belongs with the contributor commands)\n- Enriched the self-harness: ynh-dev profile \n[…]\ned/custom schemas pass through\nunchanged. Two new test cases cover rewrite + preservation.\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: migrate ynh's own harness to 0.2 + rewrite $schema URL on migrat…",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-04-22T22:19:43Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "57c28c4d9cd02e554944d4cde2967451fe9f92ea",
"body": "… hint) (#84)\n\n* fix: canonicalise --pick format to type/name; disambiguate basename clashes\n\nTwo layers of the pick pipeline disagreed on format:\n\n- assembler.CopyPicked required type/name paths (\"skills/commit\",\n \"agents/code-reviewer.md\"), erroring \"pick path must be in format\n 'type/name'\" oth\n[…]\nssembler-consumable.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: canonicalise --pick to type/name form (+ constants, did-you-mean…",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-04-22T22:19:09Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "9534da9c5fb623d28e7292ed27fd13fc74552e3f",
"body": "* docs: add namespacing and migration guides, document ynd migrate (0.2 Phase 11)\n\n- docs/namespacing.md: @ syntax, namespace derivation, storage layout,\n launcher disambiguation\n- docs/migration.md: 0.1 → 0.2 migration guide covering the filter chain,\n author/registry/end-user paths, and the 0.3 \n[…]\ner\ntutorial updates.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: 0.2 tutorials and reference sweep (4/4) (#83)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-04-22T12:56:42Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "1e6d601cbbbd583da6405baa435e4563cb45a3d0",
"body": "* feat: update cmd/ynh for 0.2 format (0.2 Phase 7)\n\n- Install: run FormatChain after copy, write installed.json for provenance\n instead of injecting InstalledFrom into the harness manifest\n- install_helpers: accept \"plugin\" and \"harness\" DetectFormat values\n- info: read manifest from .ynh-plugin/p\n[…]\nctation unreachable)\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: David Collie <support@eyelock.net>\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: 0.2 cmd — namespaced install, @ syntax, ynd migrate (3/4) (#82)",
"author_name": "David Collie",
"author_login": "eyelock",
"committed_at": "2026-04-22T12:55:34Z",
"body_truncated": true,
"is_coding_agent": true
}
],
"releases_count": 29,
"commits_last_year": 197,
"latest_release_at": "2026-07-17T20:49:12Z",
"latest_release_tag": "v0.4.1",
"releases_from_tags": false,
"days_since_last_push": 9,
"active_weeks_last_year": 14,
"days_since_latest_release": 10,
"mean_days_between_releases": 9.6
},
"community": {
"has_readme": true,
"has_license": false,
"has_description": false,
"has_contributing": true,
"health_percentage": 42,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": true
},
"ecosystem": {
"packages": [
{
"name": "github.com/eyelock/ynh",
"exists": true,
"license": null,
"keywords": [],
"ecosystem": "go",
"matches_repo": true,
"registry_url": "https://pkg.go.dev/github.com/eyelock/ynh",
"is_deprecated": false,
"latest_version": "v0.4.1",
"repository_url": "https://github.com/eyelock/ynh",
"versions_count": 30,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": null,
"first_published_at": null,
"latest_published_at": "2026-07-17T20:47:05Z",
"latest_version_yanked": null,
"days_since_latest_publish": 10
}
]
},
"popularity": {
"forks": 0,
"stars": 1,
"watchers": 0,
"fork_history": {
"days": [],
"complete": true,
"collected": 0,
"total_forks": 0
},
"star_history": null,
"open_issues_and_prs": 4
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [],
"has_llms_txt": false,
"has_dockerfile": true,
"has_mcp_signal": true,
"bootstrap_files": [
"Makefile"
],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [
"go.mod"
],
"largest_source_bytes": 67640,
"source_files_sampled": 251,
"oversized_source_files": 1,
"agent_instruction_files": [
".claude/CLAUDE.md",
"AGENTS.md"
],
"agent_instruction_max_bytes": 5442
},
"dependencies": {
"manifests": [
"go.mod"
],
"advisories": {
"error": null,
"scope": null,
"source": null,
"findings": [],
"collected": false,
"malicious": [],
"truncated": false,
"by_severity": {},
"advisory_count": 0,
"affected_count": 0,
"assessed_count": 0,
"malicious_count": 0,
"assessed_package": null,
"unassessed_count": 0,
"direct_affected_count": 0
},
"ecosystems": [
"go"
],
"dependencies": [],
"all_dependencies": {
"error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
"source": null,
"packages": [],
"collected": false,
"truncated": false,
"total_count": null,
"direct_count": null,
"indirect_count": null
}
},
"maintainership": {
"issues": {
"open_prs": 2,
"merged_prs": 158,
"open_issues": 2,
"closed_ratio": 0.714,
"closed_issues": 5,
"closed_unmerged_prs": 16
},
"bus_factor": 1,
"bot_contributors": 1,
"top_contributors": [
{
"type": "User",
"login": "eyelock",
"commits": 153,
"avatar_url": "https://avatars.githubusercontent.com/u/1277325?v=4"
}
],
"contributors_sampled": 1,
"top_contributor_share": 1
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"ci.yml",
"claude.yml",
"e2e.yml",
"protect-main.yml",
"release.yml"
],
"has_docs_dir": true,
"linter_configs": [
".golangci.yml"
],
"has_editorconfig": false,
"has_linter_config": true,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [
"go.sum"
],
"scorecard": {
"checks": [
{
"name": "Binary-Artifacts",
"score": 10,
"reason": "no binaries found in the repo",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
},
{
"name": "Branch-Protection",
"score": null,
"reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": 10,
"reason": "27 out of 27 merged PRs checked by a CI test -- score normalized to 10",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
},
{
"name": "CII-Best-Practices",
"score": 0,
"reason": "no effort to earn an OpenSSF best practices badge detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
},
{
"name": "Code-Review",
"score": 0,
"reason": "Found 0/26 approved changesets -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 0,
"reason": "project has 0 contributing companies or organizations -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": 0,
"reason": "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": 0,
"reason": "license file not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 10,
"reason": "30 commit(s) and 7 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": 0,
"reason": "dependency not pinned by hash detected -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 0,
"reason": "SAST tool is not run on all commits -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 0,
"reason": "security policy file not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": 0,
"reason": "Project has not signed or included provenance with any releases.",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": 0,
"reason": "detected GitHub workflow tokens with excessive permissions",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
},
{
"name": "Vulnerabilities",
"score": 9,
"reason": "1 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "97001a4fde38dca29056637b4b63ced933d3efe6",
"ran_at": "2026-07-28T17:34:45Z",
"aggregate_score": 3.8,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": false,
"has_dependabot_config": true
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-07-26T03:42:27Z",
"oldest_open_prs": [
{
"number": 170,
"created_at": "2026-05-18T05:43:01Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 184,
"created_at": "2026-07-19T03:42:26Z",
"last_comment_at": null,
"last_comment_author": null
}
],
"last_merged_pr_at": "2026-07-18T10:04:33Z",
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": [
{
"number": 114,
"created_at": "2026-04-29T23:06:49Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 168,
"created_at": "2026-05-14T21:37:45Z",
"last_comment_at": null,
"last_comment_author": null
}
]
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/eyelock/ynh",
"host": "github.com",
"name": "ynh",
"owner": "eyelock"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 54,
"inputs": {
"security": 38,
"vitality": 76,
"community": 25,
"governance": 51,
"engineering": 72
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "good",
"name": "Vitality",
"value": 76,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "moderate",
"name": "Development activity",
"note": null,
"notes": [],
"value": 66,
"inputs": {
"commits_last_year": 197,
"human_commit_share": 0.98,
"days_since_last_push": 9,
"active_weeks_last_year": 14
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 9 days ago",
"points": 28.8,
"status": "partial",
"details": [
{
"code": "push_recency",
"params": {
"days": 9
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "14/52 weeks with commits",
"points": 9.7,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 14
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "197 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 197
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "30 commit(s) and 7 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": null,
"notes": [],
"value": 90,
"inputs": {
"releases_count": 29,
"latest_release_tag": "v0.4.1",
"releases_from_tags": false,
"days_since_latest_release": 10,
"mean_days_between_releases": 9.6
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "29 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 29
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 10 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 10
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~9.6 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 9.6
}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "Project has not signed or included provenance with any releases.",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "abandonment",
"band": "excellent",
"name": "Abandonment",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"cap": null,
"state": "unverified",
"guards": [],
"signals": [],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": "repository_too_young",
"unanswered_open_prs": null,
"unanswered_open_issues": null,
"days_since_last_merged_pr": null,
"days_since_last_human_commit": null,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "maintenance record not established from the collected data",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_unverified",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "critical",
"name": "Community & Adoption",
"value": 25,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "critical",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 1,
"inputs": {
"forks": 0,
"stars": 1,
"watchers": 0,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "1 stars",
"points": 0,
"status": "missed",
"details": [
{
"code": "stars",
"params": {
"count": 1
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "0 forks",
"points": 0,
"status": "missed",
"details": [
{
"code": "forks",
"params": {
"count": 0
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "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": 52,
"inputs": {
"has_readme": true,
"has_license": false,
"has_contributing": true,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": true
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "no license file detected",
"points": 0,
"status": "missed",
"details": [
{
"code": "license_absent",
"params": {}
}
],
"max_points": 22.5
},
{
"key": "contributing_guide",
"name": "CONTRIBUTING guide",
"detail": null,
"points": 18,
"status": "met",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 13.5
},
{
"key": "issue_template",
"name": "Issue template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.2
},
{
"key": "pr_template",
"name": "PR template",
"detail": null,
"points": 6.3,
"status": "met",
"details": [],
"max_points": 6.3
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "moderate",
"name": "Sustainability & Governance",
"value": 51,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 10,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 1,
"top_contributor_share": 1
},
"components": [
{
"key": "bus_factor",
"name": "Bus factor",
"detail": "1 contributor(s) cover half of all commits",
"points": 9,
"status": "partial",
"details": [
{
"code": "bus_factor",
"params": {
"count": 1
}
}
],
"max_points": 54
},
{
"key": "commit_distribution",
"name": "Commit distribution",
"detail": "top contributor authored 100% of commits",
"points": 0,
"status": "missed",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 100
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "1 contributors",
"points": 1.4,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 1
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 0 contributing companies or organizations -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "moderate",
"name": "Issue & PR responsiveness",
"note": null,
"notes": [],
"value": 68,
"inputs": {
"merged_prs": 158,
"open_issues": 2,
"closed_issues": 5,
"issue_closed_ratio": 0.714,
"closed_unmerged_prs": 16
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "71% of issues closed",
"points": 33.4,
"status": "partial",
"details": [
{
"code": "issues_closed_share",
"params": {
"share": 71
}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "158/174 decided PRs merged",
"points": 34.7,
"status": "partial",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 158,
"decided": 174
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 0/26 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "at_risk",
"name": "Ownership & stewardship",
"note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"verified_domain"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 43,
"inputs": {
"followers": 3,
"owner_type": "User",
"is_verified": null,
"owner_login": "eyelock",
"public_repos": 12,
"account_age_days": 5333
},
"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": "3 followers of eyelock",
"points": 4.3,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 3,
"login": "eyelock"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "12 public repos, account ~14 yr old",
"points": 20.1,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 12
}
},
{
"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": [
"github.com/eyelock/ynh"
],
"ecosystems": "go",
"any_deprecated": false,
"min_days_since_publish": 10
},
"components": [
{
"key": "published_resolvable",
"name": "Published & resolvable",
"detail": "1 package(s) on go",
"points": 25,
"status": "met",
"details": [
{
"code": "packages_published",
"params": {
"count": 1,
"ecosystems": "go"
}
}
],
"max_points": 25
},
{
"key": "publish_recency",
"name": "Publish recency",
"detail": "latest publish 10 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 10
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "30 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 30
}
}
],
"max_points": 20
},
{
"key": "not_deprecated",
"name": "Not deprecated",
"detail": "active, not deprecated or yanked",
"points": 20,
"status": "met",
"details": [
{
"code": "package_not_deprecated",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
},
{
"key": "engineering",
"band": "good",
"name": "Engineering Quality",
"value": 72,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "good",
"name": "Engineering practices",
"note": null,
"notes": [],
"value": 84,
"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": "5 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 5
}
}
],
"max_points": 24
},
{
"key": "tests_present",
"name": "Tests present",
"detail": null,
"points": 24,
"status": "met",
"details": [],
"max_points": 24
},
{
"key": "linter_config",
"name": "Linter config",
"detail": ".golangci.yml",
"points": 16,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": ".golangci.yml"
}
}
],
"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": "27 out of 27 merged PRs checked by a CI test -- score normalized to 10",
"points": 20,
"status": "met",
"details": [],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "moderate",
"name": "Documentation",
"note": null,
"notes": [],
"value": 55,
"inputs": {
"topics": [],
"has_wiki": false,
"homepage": null,
"has_readme": true,
"has_docs_dir": true,
"has_description": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 30,
"status": "met",
"details": [],
"max_points": 30
},
{
"key": "documentation_directory",
"name": "Documentation directory",
"detail": null,
"points": 25,
"status": "met",
"details": [],
"max_points": 25
},
{
"key": "documentation_homepage_site",
"name": "Documentation / homepage site",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "repository_description",
"name": "Repository description",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "topics",
"name": "Topics",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "at_risk",
"name": "Security",
"value": 38,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "at_risk",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): Branch-Protection. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"branch_protection"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 38,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 17,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 1,
"scorecard_aggregate": 3.8
},
"components": [
{
"key": "binary_artifacts",
"name": "Binary-Artifacts",
"detail": "no binaries found in the repo",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "branch_protection",
"name": "Branch-Protection",
"detail": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "27 out of 27 merged PRs checked by a CI test -- score normalized to 10",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "cii_best_practices",
"name": "CII-Best-Practices",
"detail": "no effort to earn an OpenSSF best practices badge detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "code_review",
"name": "Code-Review",
"detail": "Found 0/26 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 0 contributing companies or organizations -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "dangerous workflow patterns detected",
"points": 0,
"status": "missed",
"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 not detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "30 commit(s) and 7 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 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "SAST tool is not run on all commits -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file not detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "Project has not signed or included provenance with any releases.",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "detected GitHub workflow tokens with excessive permissions",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "1 existing vulnerabilities detected",
"points": 6.8,
"status": "partial",
"details": [],
"max_points": 7.5
}
]
}
],
"description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
},
{
"key": "ai_readiness",
"band": "good",
"name": "AI Readiness",
"value": 80,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "excellent",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 85,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 1,
"agent_instruction_files": [
".claude/CLAUDE.md",
"AGENTS.md"
],
"agent_instruction_max_bytes": 5442
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": ".claude/CLAUDE.md, AGENTS.md",
"points": 45,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": ".claude/CLAUDE.md, AGENTS.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": "98 of 98 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 98,
"sampled": 98
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "excellent",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 90,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [
"go.sum"
],
"has_dockerfile": true,
"typed_language": true,
"bootstrap_files": [
"Makefile"
],
"has_devcontainer": false,
"has_linter_config": true,
"typecheck_configs": [],
"agent_commit_share": 0.81,
"toolchain_manifests": [
"go.mod"
],
"dependency_bot_commit_share": 0.02
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "Makefile",
"points": 18,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "Makefile"
}
}
],
"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": ".golangci.yml",
"points": 11,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": ".golangci.yml"
}
}
],
"max_points": 11
},
{
"key": "static_type_checking",
"name": "Static type checking",
"detail": "Go (statically typed)",
"points": 11,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "Go"
}
}
],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": "Dockerfile, lockfile",
"points": 10,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "Dockerfile, lockfile"
}
}
],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "81 of the last 100 commits agent-authored or agent-credited",
"points": 10,
"status": "met",
"details": [
{
"code": "agent_authored_commits",
"params": {
"count": 81,
"sampled": 100
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "2 of the last 100 commits are automated dependency updates",
"points": 8,
"status": "met",
"details": [
{
"code": "dependency_bot_commits",
"params": {
"count": 2,
"sampled": 100
}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "excellent",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"primary_language": "Go",
"largest_source_bytes": 67640,
"source_files_sampled": 251,
"oversized_source_files": 1
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "Go (statically typed)",
"points": 45,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "Go"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "1/251 source files over 60KB",
"points": 54.8,
"status": "partial",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 251,
"oversized": 1
}
}
],
"max_points": 55
}
]
},
{
"key": "ai_interfaces",
"band": "critical",
"name": "Machine-readable interfaces",
"note": null,
"notes": [],
"value": 20,
"inputs": {
"example_dirs": [],
"has_mcp_signal": true,
"api_schema_files": []
},
"components": [
{
"key": "api_schema_openapi_graphql_proto",
"name": "API schema (OpenAPI/GraphQL/proto)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 40
},
{
"key": "mcp_server",
"name": "MCP server",
"detail": null,
"points": 20,
"status": "met",
"details": [],
"max_points": 20
},
{
"key": "runnable_examples",
"name": "Runnable examples",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 40
}
]
}
],
"description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
}
],
"metrics_version": "1.13.0"
},
"warnings": [
"Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
"GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
],
"report_type": "repository",
"generated_at": "2026-07-28T17:35:02.788480Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/e/eyelock/ynh.svg",
"full_name": "eyelock/ynh",
"license_state": "absent",
"license_spdx": null
}