原始 JSON 报告 机器可读
{
"data": {
"repo": {
"topics": [],
"is_fork": false,
"size_kb": 287,
"has_wiki": true,
"homepage": null,
"languages": {
"Go": 88252,
"Shell": 12582,
"Python": 548,
"Go Template": 1530
},
"pushed_at": "2026-07-20T03:13:57Z",
"created_at": "2026-07-13T14:32:52Z",
"owner_type": "User",
"updated_at": "2026-07-20T03:14:01Z",
"description": null,
"is_archived": false,
"is_disabled": false,
"license_spdx": null,
"default_branch": "main",
"license_spdx_raw": null,
"primary_language": "Go",
"significant_languages": [
"Go",
"Shell"
]
},
"owner": {
"blog": null,
"name": "duck3712",
"type": "User",
"login": "dirtyduck3712",
"company": null,
"location": null,
"followers": 3,
"avatar_url": "https://avatars.githubusercontent.com/u/11313766?v=4",
"created_at": "2015-03-04T12:55:58Z",
"is_verified": null,
"public_repos": 8,
"account_age_days": 4159
},
"license": {
"state": "absent",
"spdx_id": null,
"raw_spdx": null,
"file_present": false,
"scorecard_found": false,
"profile_has_license": false
},
"activity": {
"releases": [],
"recent_commits": [
{
"oid": "f9eb80fb1bb6a71b6264a760b14ff0434442432f",
"body": "Telegram 出口三項手動驗收實測通過(firing / send_resolved / VL Basic Auth)。\n通知訊息改走 alertmanager templates 機制,正體中文。\n關鍵陷阱:parse_mode HTML 下 html/template 已自動跳脫,模板內不可再手動跳脫。",
"is_bot": false,
"headline": "merge: 告警通知中文化(Telegram 模板 + rule summary)+ 驗收清單完成",
"author_name": "DrDex",
"author_login": null,
"committed_at": "2026-07-20T03:08:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d18414281bdf33371b237c93cfe9a52d5d163cd3",
"body": "三項手動驗收實測通過。原標準「/api/v1/rules 有 group」不足以證明\ndatasource 認證可用——rule 從磁碟載入,查 VL 全 401 時 group 照樣出現;\n改記正確驗法(401/200 對照閘門 + lastError 空 + 端到端 firing),\n並補充通知訊息格式與跳脫陷阱。",
"is_bot": false,
"headline": "docs(alert): Telegram 驗收清單完成 + 修正 Basic Auth 驗收標準",
"author_name": "DrDex",
"author_login": null,
"committed_at": "2026-07-20T03:07:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0eac6c799bb486aa3be42af5c567951b142a6598",
"body": "以 alertmanager templates 機制取代內建的 telegram.default.message:\n- 新增 alertmanager/templates/ducklog.tmpl(正體中文,firing/resolved 兩種版面)\n- alertmanager.yml.tmpl 加 templates: 與 telegram_configs.message:\n- docker-compose 掛載 templates 目錄\n\nparse_mode: HTML 下 telegram notifier 走 TmplHTML → Go html/template,\n{{ }} 帶出的值已自動 contextual escaping,模板內不可再手動跳脫 & < >,\n否則雙重跳脫、訊息顯示成字面 < &(已踩過,原因記於模板註解)。",
"is_bot": false,
"headline": "feat(alert): Telegram 通知改中文模板",
"author_name": "DrDex",
"author_login": null,
"committed_at": "2026-07-20T03:07:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "98aa12a2aa5d6a49074595fe980f1ca2541d02a1",
"body": "HighErrorRate / FatalPattern 的 annotations.summary 由英文改為正體中文,\nsummary 會原樣帶進 Telegram 通知,故與訊息模板一併中文化。",
"is_bot": false,
"headline": "feat(alert): rule summary 改中文",
"author_name": "DrDex",
"author_login": null,
"committed_at": "2026-07-20T03:07:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1f45af65e7daaa68ea321b89e1c8370e45a17925",
"body": "Claude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
"is_bot": false,
"headline": "merge: service 靜默偵測(absence,不分組 stats filter n:0)",
"author_name": "DrDex",
"author_login": null,
"committed_at": "2026-07-18T23:52:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0383e250a504ab84ba13c5a49bd32e910e541ac2",
"body": "Claude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
"is_bot": false,
"headline": "fix(alert): e2e alive 對照改 fail-closed + README glob footgun 提醒",
"author_name": "DrDex",
"author_login": null,
"committed_at": "2026-07-18T20:13:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e85d59b5c23a2c81e8b47dc812c30900eec5b9f6",
"body": "Claude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
"is_bot": false,
"headline": "docs: spec 補冷啟瞬時誤報 caveat(e2e 浮現)",
"author_name": "DrDex",
"author_login": null,
"committed_at": "2026-07-18T20:04:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7159de372cceafbf9cb3bb5110928991b206105b",
"body": null,
"is_bot": false,
"headline": "docs(alert): service 靜默偵測使用說明 + 恆 firing 警示",
"author_name": "DrDex",
"author_login": null,
"committed_at": "2026-07-18T20:01:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6c887804f5266e8d80a9e88abe9d50898e90ad1a",
"body": "Claude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
"is_bot": false,
"headline": "test(alert): service 靜默偵測 e2e(dead firing + alive 對照)",
"author_name": "DrDex",
"author_login": null,
"committed_at": "2026-07-18T19:52:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a56808d43c997417b84acbe59fd903676c7fcd38",
"body": null,
"is_bot": false,
"headline": "feat(alert): service 靜默偵測 rule 範本 + vmalert glob 掛載",
"author_name": "DrDex",
"author_login": null,
"committed_at": "2026-07-18T18:42:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ce97a8f50da159b51aad0b39d2810a283165679a",
"body": "Claude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
"is_bot": false,
"headline": "docs: service 靜默偵測實作計畫(3 task,含 firing 必驗點)",
"author_name": "DrDex",
"author_login": null,
"committed_at": "2026-07-18T18:39:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c7ce27179a635a9e8751b816844a1a33ac1c9c2a",
"body": "Claude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
"is_bot": false,
"headline": "docs: service 靜默偵測(absence)設計",
"author_name": "DrDex",
"author_login": null,
"committed_at": "2026-07-18T18:33:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8b4b35532e0dc2cb32006bce12e32b06ade5e6a1",
"body": "Claude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
"is_bot": false,
"headline": "merge: vmalert 告警(vmalert+VM+alertmanager,docker-compose,off-by-default)",
"author_name": "DrDex",
"author_login": null,
"committed_at": "2026-07-18T18:05:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a037aa026dddd74ba2bf2f1b6855287c27b631ab",
"body": "Claude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
"is_bot": false,
"headline": "docs(alert): 補 VL 側 Basic Auth 啟用說明 + 修正 .env.example 過時註解",
"author_name": "DrDex",
"author_login": null,
"committed_at": "2026-07-18T18:00:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2d4da583710bbfc2c7ec0eb8130f7d09fc592a29",
"body": null,
"is_bot": false,
"headline": "docs(alert): 告警 stack 啟動說明 + Telegram 手動驗收清單",
"author_name": "DrDex",
"author_login": null,
"committed_at": "2026-07-18T17:52:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9ce49859d2c1467508315cd98c58149168525bbb",
"body": "Claude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
"is_bot": false,
"headline": "test(alert): 端到端 smoke(ingest panic → FatalPattern → webhook sink)",
"author_name": "DrDex",
"author_login": null,
"committed_at": "2026-07-18T17:47:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "70e10097bd34d636c1b5c3068aa054a0dd134d4d",
"body": "Claude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
"is_bot": false,
"headline": "feat(alert): docker-compose alert stack(VL+VM+vmalert+alertmanager)",
"author_name": "DrDex",
"author_login": null,
"committed_at": "2026-07-18T17:31:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "78c29a1d5f95e5d336ef2dda60d42f9ebf3020ff",
"body": "Claude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
"is_bot": false,
"headline": "feat(alert): alertmanager config template + envsubst 渲染腳本",
"author_name": "DrDex",
"author_login": null,
"committed_at": "2026-07-18T17:25:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6c1d0bdf1133a64a8280c5ba417fe1d333548945",
"body": null,
"is_bot": false,
"headline": "feat(alert): vmalert vlogs rule 集(error-rate 門檻 + fatal-pattern)",
"author_name": "DrDex",
"author_login": null,
"committed_at": "2026-07-18T17:21:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ac59b5d0f82d261a6bc9f1d8d06746a8613b411a",
"body": "Claude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
"is_bot": false,
"headline": "docs: vmalert 告警實作計畫(5 task,dryRun+e2e 驗證)",
"author_name": "DrDex",
"author_login": null,
"committed_at": "2026-07-18T17:14:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a1dabcf2b4034a2ce9f889aba4431a58ad1ce7df",
"body": "Claude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
"is_bot": false,
"headline": "docs: vmalert 告警設計(標準全家桶 + docker-compose)",
"author_name": "DrDex",
"author_login": null,
"committed_at": "2026-07-18T09:16:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "89361a4727630feab5ffa0c8a059735b408ddb85",
"body": "偵測舊接法(本機 replace / 裸 ducklog/client import / APIKey 欄位),\n① 刪已移除的 APIKey 欄位(必要,否則 rebuild 炸)② 本機 replace → go get\n完整路徑。含安全閘與「改名不破壞 replace、只有 APIKey 移除會炸」的說明。\nmigrate 步驟已用真實多行 config 端到端實測(炸→綠)。\n\nClaude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
"is_bot": false,
"headline": "feat(skill): ducklog-integration 加 migrate 舊接法模式",
"author_name": "DrDex",
"author_login": null,
"committed_at": "2026-07-18T06:59:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c8520443e27ff25d5f873d080d0a4c55a1fee84c",
"body": "Claude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
"is_bot": false,
"headline": "docs: skill 旁補 symlink 安裝說明(全域啟用/新機器重建)",
"author_name": "DrDex",
"author_login": null,
"committed_at": "2026-07-18T06:48:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "13c0f2c9ca128a0fa152a72608afff1442978034",
"body": "canonical 移入 repo .claude/skills/;~/.claude/skills 那份改 symlink\n指向此處(單一來源、有版控、仍全域可用)。內容為 go get 版接入指南。\n\nClaude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
"is_bot": false,
"headline": "chore: ducklog-integration skill 納入版控",
"author_name": "DrDex",
"author_login": null,
"committed_at": "2026-07-18T06:47:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "15e47b409da78f555d706f91215823b3513958d6",
"body": "client/zapsink 正名為 github.com/dirtyduck3712/ducklog/*,外部專案改用\ngo get,不再整包複製。root module 不動;zapsink 保留 replace 供 repo 內開發\n(對外部 consumer 被忽略,走 require v0.1.0)。接入文件改 go get 為主。\n\n發佈需另打 tag client/v0.1.0 + zapsink/v0.1.0。\n\nClaude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
"is_bot": false,
"headline": "merge: 發佈 client/zapsink 模組(可 go get)",
"author_name": "DrDex",
"author_login": null,
"committed_at": "2026-07-18T06:32:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ef20259ba9a05129dc678e9411dc307c016c0e58",
"body": "Claude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
"is_bot": false,
"headline": "docs: 註明 client 需 Go≥1.22、zapsink 需 Go≥1.24",
"author_name": "DrDex",
"author_login": null,
"committed_at": "2026-07-18T06:32:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b4f9eb2d7ca946d1d08f9bcadd4120efcc38c8d3",
"body": "INTEGRATION §0 以 go get 為主要接法,import 範例改完整路徑。\n\nClaude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
"is_bot": false,
"headline": "docs: 接入改用 go get github.com/dirtyduck3712/ducklog/*",
"author_name": "DrDex",
"author_login": null,
"committed_at": "2026-07-18T06:21:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "56c0192e95cf7db367a67073c57dc71c36527f8c",
"body": "裸 module path 無法 go get;改為 VCS 路徑供外部安裝。\nzapsink 保留 replace => ../client 供 repo 內開發。root 不動。\n\nClaude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
"is_bot": false,
"headline": "refactor(modules): client/zapsink 正名為 github.com/dirtyduck3712/ducklog/*",
"author_name": "DrDex",
"author_login": null,
"committed_at": "2026-07-18T06:17:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c3c99d6370b6bd8ea924f1b02e110aef23cfa321",
"body": "Claude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
"is_bot": false,
"headline": "docs: 發佈 client/zapsink 模組實作計畫",
"author_name": "DrDex",
"author_login": null,
"committed_at": "2026-07-18T06:15:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "30c91417afb5101184074bd59ab8b35e03618f65",
"body": "正名 client/zapsink 為 github.com/dirtyduck3712/ducklog/* 路徑,\n取代整包複製/本機 replace。root 不動。monorepo + 前綴 tag。\n\nClaude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
"is_bot": false,
"headline": "docs: 發佈 client/zapsink 模組設計(可 go get)",
"author_name": "DrDex",
"author_login": null,
"committed_at": "2026-07-18T06:09:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "596161c1ec145ea4ddd95aa85ffb8fedd0bc689a",
"body": "VL 以 -httpAuth.* 開一組 Basic Auth;寫入端 RemoteConfig.Username/Password、\n讀取端 VL_USERNAME/VL_PASSWORD env,三端留空維持無 auth。移除對 VL 無效的\nAPIKey/Bearer。/health 不受 auth 保護,故 MCP 啟動以受保護查詢驗憑證 fail-fast。\nTLS 記 caveat。\n\nClaude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
"is_bot": false,
"headline": "merge: VL Basic Auth(單一共享密鑰,off-by-default)",
"author_name": "DrDex",
"author_login": null,
"committed_at": "2026-07-18T05:08:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e20afb4b6bb1f91257fed050e0df7bf2a53f1dda",
"body": "Claude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
"is_bot": false,
"headline": "docs: VL Basic Auth 執行示範與 env 說明(含 TLS caveat)",
"author_name": "DrDex",
"author_login": null,
"committed_at": "2026-07-18T04:57:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e4bf1484c9e7939999cfef488240dcdc1c8a76ef",
"body": "Claude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
"is_bot": false,
"headline": "fix(mcp): 啟動時以受保護查詢驗證 VL 憑證(/health 不受 auth 保護)",
"author_name": "DrDex",
"author_login": null,
"committed_at": "2026-07-18T04:51:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9a9cd245a034ab4dfdc6cf22fb1001f424add2c9",
"body": "vl.Client 新增 NewWithAuth,Ping/Query 帶 Basic Auth;MCP 讀 env。\nvltest 加 StartVLWithAuth 供端到端驗證。New 簽章不變。\n\nClaude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
"is_bot": false,
"headline": "feat(vl): 讀取端 Basic Auth(NewWithAuth + VL_USERNAME/PASSWORD)",
"author_name": "DrDex",
"author_login": null,
"committed_at": "2026-07-18T04:46:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "16e517df6aa065dc6273b6b37f4f974b9dcc5663",
"body": "RemoteConfig 移除 APIKey、改 Username/Password 走 SetBasicAuth;\n憑證空則不帶 auth header(off-by-default)。\n\nClaude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
"is_bot": false,
"headline": "feat(client): VL Basic Auth,移除對 VL 無效的 Bearer",
"author_name": "DrDex",
"author_login": null,
"committed_at": "2026-07-18T04:39:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "280cd5a0420aecc208350df71792450eb8153b3f",
"body": "Claude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
"is_bot": false,
"headline": "docs: VL Basic Auth 實作計畫",
"author_name": "DrDex",
"author_login": null,
"committed_at": "2026-07-18T04:36:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ecbab6cd46aa982a789e95dc599a8a734ef2b1f7",
"body": "單一共享密鑰、off-by-default;移除 client 對 VL 無效的 Bearer,\n改帶 Basic Auth;讀取端獨立 VL_USERNAME/VL_PASSWORD env。TLS 記 caveat。\n\nClaude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
"is_bot": false,
"headline": "docs: VL Basic Auth 設計",
"author_name": "DrDex",
"author_login": null,
"committed_at": "2026-07-18T04:27:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "db26e2410f705b31549caea33ee85c4f2f387b5f",
"body": "第 5 個 MCP tool — 4 個罐頭 tool 不合用時的受控 raw LogsQL 通道。\n時間過濾 quote-aware 注入(括號包裹解 OR 優先序)、命中 limit 誠實截斷。\n\nClaude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
"is_bot": false,
"headline": "merge: run_logsql 逃生 tool",
"author_name": "DrDex",
"author_login": null,
"committed_at": "2026-07-18T04:13:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "de1fd25e075f0c2b8fc0f39c89ec6e54fa0cd99d",
"body": "① injectTimeFilter 改用 firstUnquotedPipe 找引號外第一個 pipe 切分,\nfilter 段用括號包住再 AND 時間;修正正則/phrase 內 | 被誤切導致 _time\n被吞、時間護欄靜默失效,並解掉 top-level OR 的優先序漏過濾。\n② 命中 limit 截斷時清零 TotalMatched,消除 total/returned/truncated 矛盾。\n補 TestInjectTimeFilter(含正則/OR 回歸)、time-actually-filters、\nQUERY_FAILED 三組測試。\n\nClaude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
"is_bot": false,
"headline": "fix(tools): run_logsql 時間注入 quote-aware + 截斷不吐誤導 total_matched",
"author_name": "DrDex",
"author_login": null,
"committed_at": "2026-07-18T04:06:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d7a26d1a9f58fd5ff29f32a74d30c473796118af",
"body": "第 5 個 tool,description 引導 AI 優先用專用 tool。\n\nClaude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
"is_bot": false,
"headline": "feat(mcpserver): 註冊 run_logsql tool",
"author_name": "DrDex",
"author_login": null,
"committed_at": "2026-07-18T03:49:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "43e9e5979862cc38360fd37837e96022404f67e3",
"body": "時間過濾注入第一個 pipe 之前;命中 limit 即標 Truncated,不硬湊 Count。\n\nClaude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
"is_bot": false,
"headline": "feat(tools): run_logsql 逃生口 — 任意 LogsQL pipeline",
"author_name": "DrDex",
"author_login": null,
"committed_at": "2026-07-18T03:44:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c2bc9e889b82caadda4d6b4808721285ad33cafa",
"body": "Claude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
"is_bot": false,
"headline": "docs: run_logsql 逃生 tool 實作計畫",
"author_name": "DrDex",
"author_login": null,
"committed_at": "2026-07-18T03:42:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "30a64fd94c2a02e1235e12ac27ea6fcc1366170b",
"body": "4 個罐頭 tool 不合用時的受控 raw LogsQL 通道。沿用 requireRange +\nBoundRaw 護欄;關鍵是時間過濾須注入第一個 pipe 之前。\n\nClaude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
"is_bot": false,
"headline": "docs: run_logsql 逃生 tool 設計",
"author_name": "DrDex",
"author_login": null,
"committed_at": "2026-07-18T03:38:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "895632da41fe227c6967114894cd8c012e6da31b",
"body": "json.Marshal(error) 會「成功」但產出 {}(無 exported fields),\nVictoriaLogs 攤平空物件後欄位整個不見——slog 慣用的 \"err\", err\n在查詢端看不到錯誤原因。jsonSafe 在 marshal 檢查前先轉字串。\n\nClaude-Session: https://claude.ai/code/session_0146m1jQxFDhxaBHsxrx1LRn",
"is_bot": false,
"headline": "fix(client): error attr 序列化為 Error() 字串,修欄位靜默消失",
"author_name": "DrDex",
"author_login": null,
"committed_at": "2026-07-18T01:56:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "24f56f3c27411f7d26980c4ca84ab84ef566e5a5",
"body": "…ebug\n\nzapcore.NewTee evaluates each sub-core's Enabled independently, so the\nducklog sink hardcoded at LevelDebug kept receiving debug entries even when\nthe base console core was gated at info — LOG_LEVEL=info didn't stop debug\nfrom reaching VictoriaLogs. Tee now derives the sink level from cfg.Level\n(default Info), matching client.RemoteHandler.\n\nClaude-Session: https://claude.ai/code/session_01F6M2eYKpycNVAbGmH7vcSy",
"is_bot": false,
"headline": "fix(zapsink): respect configured level in Tee instead of hardcoding D…",
"author_name": "DrDex",
"author_login": null,
"committed_at": "2026-07-13T22:54:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ada6c01439eed366d58e6c67da93d9437d03db96",
"body": "phase0/ was throwaway probe code that validated (and ultimately\ndisproved) the self-hosted DuckLake storage approach. The pivot to\nVictoriaLogs + MCP is merged and the rationale/evidence lives in the\ndesign doc under docs/superpowers/specs/. The spikes carried no\nunique knowledge, and the committed FINDINGS.md (\"DuckLake PASS\")\ncontradicted the shipped architecture.\n\nClaude-Session: https://claude.ai/code/session_01WGuG4rjv2dL8XuFUyLhumf",
"is_bot": false,
"headline": "chore: remove phase0 DuckLake validation spikes",
"author_name": "DrDex",
"author_login": null,
"committed_at": "2026-07-13T15:04:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c277822ed97597683722ea7195ef71f287f47afa",
"body": null,
"is_bot": false,
"headline": "merge: rename docklog -> ducklog",
"author_name": "ducklog",
"author_login": null,
"committed_at": "2026-07-13T14:29:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1df59bbe43c0e1deff895a403c085e3beee90c0c",
"body": "Module paths (ducklog, ducklog/client, ducklog/zapsink), all imports,\ncmd/ducklog-mcp, the MCP server name, DUCKLOG_VL_URL env var, README,\nINTEGRATION.md, and run-dev.sh. Behavior unchanged.\n\nClaude-Session: https://claude.ai/code/session_01HKX13PQ3HszozbEJUSYoKd",
"is_bot": false,
"headline": "rename: docklog -> ducklog across modules, binary, docs, MCP name",
"author_name": "ducklog",
"author_login": null,
"committed_at": "2026-07-13T14:29:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4b99b26bc2105a11dbbc491e356316b11262cd0c",
"body": null,
"is_bot": false,
"headline": "merge: zapsink reusable zap adapter + integration guide",
"author_name": "docklog",
"author_login": null,
"committed_at": "2026-07-13T14:13:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4ddd0606893d270133ac8920ff9444ea0ce89831",
"body": "- zapsink: new importable module (docklog/zapsink) bridging go.uber.org/zap\n to the slog-based transport, so any zap service can feed VictoriaLogs.\n NewCore (generic zap->slog.Handler) + Tee (one-call wrap of a base core\n with a docklog sink). Ported from the per-project copy that lived in a\n co\n[…]\nace,\n MCP registration, and the gotchas (vmui time range, curl content-type,\n non-serializable attrs, zap Fatal skips drain).\n\nClaude-Session: https://claude.ai/code/session_01HKX13PQ3HszozbEJUSYoKd",
"is_bot": false,
"headline": "feat(zapsink): reusable zap->docklog adapter + integration guide",
"author_name": "docklog",
"author_login": null,
"committed_at": "2026-07-13T14:13:49Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "cb4f45d0fdc4ba406d09ea6205e4e4c2373958cf",
"body": null,
"is_bot": false,
"headline": "merge: never drop logs on non-serializable attrs (transport hardening)",
"author_name": "docklog",
"author_login": null,
"committed_at": "2026-07-13T04:35:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "09a155945eca765c9f4233653487eaeb82f9b557",
"body": "Routing slog.Default() to the transport captures library error logs\n(e.g. pgx) whose attr values contain non-JSON-serializable fields such\nas pgconn.DialFunc. Two independent defects dropped whole batches of\ngood logs silently (only the stdout fallback kept them):\n\n1. flattenAttr stored raw attr val\n[…]\neither the batch nor the line is lost.\n\nBoth paths now honor the never-silently-drop contract. Regression tests\nadded for each.\n\nClaude-Session: https://claude.ai/code/session_01HKX13PQ3HszozbEJUSYoKd",
"is_bot": false,
"headline": "fix(client): never drop logs on non-serializable attrs",
"author_name": "docklog",
"author_login": null,
"committed_at": "2026-07-13T04:30:01Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "a57617c5987d3fcf0b8e068ae31387f48955878c",
"body": null,
"is_bot": false,
"headline": "merge: VictoriaLogs backend + MCP tooling layer pivot",
"author_name": "docklog",
"author_login": null,
"committed_at": "2026-07-13T03:04:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "28cc4ace081bd1899583b3022da5fb9c73f4026a",
"body": "…ashes, honest get_trace total, reject piped search) + tests",
"is_bot": false,
"headline": "fix: harden anti-confabulation contract (bound compare, escape backsl…",
"author_name": "docklog",
"author_login": null,
"committed_at": "2026-07-13T02:57:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "be9708b05d99dc5f858ef72ab4860803e0aa361b",
"body": null,
"is_bot": false,
"headline": "chore: gitignore docklog-mcp build output",
"author_name": "docklog",
"author_login": null,
"committed_at": "2026-07-13T02:49:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b97a9577c72c096d8a80acbfff5dcda89f89af36",
"body": null,
"is_bot": false,
"headline": "docs: run scripts + README for VictoriaLogs + MCP setup",
"author_name": "docklog",
"author_login": null,
"committed_at": "2026-07-13T02:45:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "371a03f7c02e604dc75e77ea5f5a40a159429238",
"body": "…toriaLogs)",
"is_bot": false,
"headline": "refactor: remove superseded DuckLake storage layer (superseded by Vic…",
"author_name": "docklog",
"author_login": null,
"committed_at": "2026-07-13T02:40:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7affb4c055ef4f9e8b9ca21629e6b1a6f80bfa03",
"body": null,
"is_bot": false,
"headline": "feat(mcp): stdio MCP server exposing 4 LogsQL-backed tools",
"author_name": "docklog",
"author_login": null,
"committed_at": "2026-07-13T02:34:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5dc4bfaad11ecc534f6bc8506cff65c12e5361e5",
"body": "…s over LogsQL",
"is_bot": false,
"headline": "feat(tools): summarize_errors, get_trace, search_logs, compare_period…",
"author_name": "docklog",
"author_login": null,
"committed_at": "2026-07-13T02:23:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9407d32c2bafeafb19d89bf4ff89b38acf2fc629",
"body": "…rade)",
"is_bot": false,
"headline": "feat(bound): anti-confabulation contract (token-bound, explicit downg…",
"author_name": "docklog",
"author_login": null,
"committed_at": "2026-07-13T02:20:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "edba0c1d0de2b1e5a529e8c2f3e0b02953ade0da",
"body": null,
"is_bot": false,
"headline": "feat(vl): LogsQL HTTP client + query builders",
"author_name": "docklog",
"author_login": null,
"committed_at": "2026-07-13T02:10:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "78c8463411795a34364d15ce595fe2134c233efd",
"body": null,
"is_bot": false,
"headline": "feat(client): repoint transport e2e to VictoriaLogs ingest",
"author_name": "docklog",
"author_login": null,
"committed_at": "2026-07-13T02:04:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "670c4a89076a8e7dee421108a7c371015b0e5ede",
"body": null,
"is_bot": false,
"headline": "docs: pivot design — VictoriaLogs backend + thin MCP tooling layer",
"author_name": "docklog",
"author_login": null,
"committed_at": "2026-07-13T01:49:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f02f3393de916ef3b047128f9585bcca2340c923",
"body": null,
"is_bot": false,
"headline": "fix(config): default rate_limits.default to 1000 (avoid silent drop-all)",
"author_name": "docklog",
"author_login": null,
"committed_at": "2026-07-12T22:55:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bcd945e7abc40019ebcdd005d1cb9baecb5ef28a",
"body": "…ain to 5s",
"is_bot": false,
"headline": "fix(client): resolve LogValuer, flatten inline groups, bound Close dr…",
"author_name": "docklog",
"author_login": null,
"committed_at": "2026-07-12T22:46:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e5896a6c8d62a3a1557b27a0ced93acc71141fc5",
"body": null,
"is_bot": false,
"headline": "test(client): end-to-end wire-contract test against real docklog server",
"author_name": "docklog",
"author_login": null,
"committed_at": "2026-07-12T22:30:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8f7bcaadc434c343781659a20ce2da3607145b62",
"body": null,
"is_bot": false,
"headline": "feat(client): trace id HTTP middleware + outbound propagation",
"author_name": "docklog",
"author_login": null,
"committed_at": "2026-07-12T22:25:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "de2045aa53832654652f380b2935784e538235e1",
"body": null,
"is_bot": false,
"headline": "fix(client): idempotent Close + serialize shutdown-summary write",
"author_name": "docklog",
"author_login": null,
"committed_at": "2026-07-12T22:24:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e49c1af2894053263ebb5d35f166f18568ec81b5",
"body": null,
"is_bot": false,
"headline": "feat(client): slog.Handler with dual-write, trace, non-blocking, Close",
"author_name": "docklog",
"author_login": null,
"committed_at": "2026-07-12T22:19:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "17117871fbd455e06d3a44fabf829d61167895a0",
"body": "…ng drop",
"is_bot": false,
"headline": "feat(client): background batch sender with retry, breaker, non-blocki…",
"author_name": "docklog",
"author_login": null,
"committed_at": "2026-07-12T22:14:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e3d86ce4d1dfd69c0ad7702e29b40bf812411dba",
"body": null,
"is_bot": false,
"headline": "feat(client): RemoteConfig with defaults",
"author_name": "docklog",
"author_login": null,
"committed_at": "2026-07-12T22:10:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d7d6bf3453ab8df414aeedd9671ea393d07969eb",
"body": null,
"is_bot": false,
"headline": "feat(client): consecutive-failure circuit breaker",
"author_name": "docklog",
"author_login": null,
"committed_at": "2026-07-12T22:08:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cf4c66b1828265a549e8c44d4354e45f9cc79f94",
"body": null,
"is_bot": false,
"headline": "feat(client): trace id generation + context propagation",
"author_name": "docklog",
"author_login": null,
"committed_at": "2026-07-12T22:06:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "780f4b6f53936b4f88eeefdc0f7ec8329246c8a4",
"body": null,
"is_bot": false,
"headline": "feat(client): module scaffold + wire types",
"author_name": "docklog",
"author_login": null,
"committed_at": "2026-07-12T22:03:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "43cce6cb2bbb8d11a483116fded287641a4accaf",
"body": null,
"is_bot": false,
"headline": "docs: Phase 1b client transport implementation plan",
"author_name": "docklog",
"author_login": null,
"committed_at": "2026-07-12T21:43:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "37ee6d0fe39195d32ceeabf59746458958919e45",
"body": null,
"is_bot": false,
"headline": "docs: Phase 1b Go client transport design spec",
"author_name": "docklog",
"author_login": null,
"committed_at": "2026-07-12T21:38:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "86c706571b0f020e4045879b2994672da046b9f6",
"body": null,
"is_bot": false,
"headline": "fix(ingest): canonicalize valid trace_id so no format can poison a batch",
"author_name": "docklog",
"author_login": null,
"committed_at": "2026-07-12T18:51:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0fe30e9b190468496cfca7d73e2c3b8b90aa0220",
"body": "…json drops\n\nThree whole-branch review fixes defending never-lose / never-silent rules:\n\n- I-2: ParseLevel is now case-insensitive (slog's INFO/ERROR no longer\n silently downgrade to Info); genuinely unknown non-empty levels are\n marked _level_unknown instead of a silent downgrade.\n- I-1: non-UUID\n[…]\nr() is now checked so an over-cap line returns 400\n instead of a silent truncated 200.\n\nmergeSkewFlag generalized into a shared mergeAttr helper.\nTests added for all three; model+ingest suites green.",
"is_bot": false,
"headline": "fix(ingest): case-insensitive level, trace_id validation, explicit nd…",
"author_name": "docklog",
"author_login": null,
"committed_at": "2026-07-12T18:49:27Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f475e0dba0d49c1293df885173482f85a46442e5",
"body": null,
"is_bot": false,
"headline": "test: assert crash test committed progress (no vacuous 0/0 pass)",
"author_name": "docklog",
"author_login": null,
"committed_at": "2026-07-12T18:36:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "646a30928aee700c694b3f6306aa25f8f5a1a177",
"body": null,
"is_bot": false,
"headline": "test: crash recovery integration test (kill -9 during ingest)",
"author_name": "docklog",
"author_login": null,
"committed_at": "2026-07-12T18:33:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "739b17b2d3e91d07b361a6723c495c1c7777a0c3",
"body": null,
"is_bot": false,
"headline": "feat: config loader + main wiring with graceful shutdown",
"author_name": "docklog",
"author_login": null,
"committed_at": "2026-07-12T18:28:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "38876c5414e90ba3a4034454f77e87ca800aaa9e",
"body": "…opped",
"is_bot": false,
"headline": "test: assert health exposes catalog_size_mb, last_checkpoint null, dr…",
"author_name": "docklog",
"author_login": null,
"committed_at": "2026-07-12T18:25:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d57acc673c2b3de9bb75b45c1aa564aee902471c",
"body": null,
"is_bot": false,
"headline": "feat: health endpoint with catalog size + last checkpoint",
"author_name": "docklog",
"author_login": null,
"committed_at": "2026-07-12T18:23:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "287bc5037603101e9b4563aaddb974963f1a7d68",
"body": null,
"is_bot": false,
"headline": "test: cover checkpoint panic recovery via Checkpointer interface",
"author_name": "docklog",
"author_login": null,
"committed_at": "2026-07-12T18:20:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0291044e9e8d27348378698f4412dc7f1dd3fe0d",
"body": null,
"is_bot": false,
"headline": "feat: checkpoint loop with panic recovery + last-checkpoint tracking",
"author_name": "docklog",
"author_login": null,
"committed_at": "2026-07-12T18:18:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "45b51a3a17f062ed5d4777973e08c0787ba57e64",
"body": null,
"is_bot": false,
"headline": "feat: ingest handler wiring auth, skew, rate-limit, disk-guard, store",
"author_name": "docklog",
"author_login": null,
"committed_at": "2026-07-12T18:13:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dd535b82504c91217e49a4e062f06cfefd8ea4cb",
"body": null,
"is_bot": false,
"headline": "feat: disk usage guard with warn/reject/purge thresholds",
"author_name": "docklog",
"author_login": null,
"committed_at": "2026-07-12T18:07:40Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a7f145b5985fe3f9db627891dc9fc05247887e75",
"body": null,
"is_bot": false,
"headline": "feat: per-service token bucket rate limiter",
"author_name": "docklog",
"author_login": null,
"committed_at": "2026-07-12T18:05:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7da78419bb502870f08c05ac9ec11f91f300e1d0",
"body": null,
"is_bot": false,
"headline": "feat: bearer key auth with scopes",
"author_name": "docklog",
"author_login": null,
"committed_at": "2026-07-12T18:03:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d961222cc837e41a3a8d25872de1710d35536666",
"body": null,
"is_bot": false,
"headline": "feat: separate metrics store with upsert + dropped counter",
"author_name": "docklog",
"author_login": null,
"committed_at": "2026-07-12T18:00:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "65f326cee997e020c0b4cb793cd37389ee9f9ec7",
"body": null,
"is_bot": false,
"headline": "feat: DuckLake store with batch insert, checkpoint, retention",
"author_name": "docklog",
"author_login": null,
"committed_at": "2026-07-12T17:57:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f446509f17777b9bafeb68bdd22af7b9db335f24",
"body": null,
"is_bot": false,
"headline": "feat: project scaffold + model types",
"author_name": "docklog",
"author_login": null,
"committed_at": "2026-07-12T17:54:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0d54bd03a034a6d96491a4eb4fc7d91a95069527",
"body": null,
"is_bot": false,
"headline": "chore: initial repo — spec, phase0 findings, phase1 plan",
"author_name": "docklog",
"author_login": null,
"committed_at": "2026-07-12T17:52:21Z",
"body_truncated": false,
"is_coding_agent": false
}
],
"releases_count": 0,
"commits_last_year": 93,
"latest_release_at": null,
"latest_release_tag": null,
"releases_from_tags": false,
"days_since_last_push": 3,
"active_weeks_last_year": 2,
"days_since_latest_release": null,
"mean_days_between_releases": null
},
"community": {
"has_readme": true,
"has_license": false,
"has_description": false,
"has_contributing": false,
"health_percentage": 14,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "github.com/dirtyduck3712/ducklog/client",
"exists": true,
"license": null,
"keywords": [],
"ecosystem": "go",
"matches_repo": true,
"registry_url": "https://pkg.go.dev/github.com/dirtyduck3712/ducklog/client",
"is_deprecated": false,
"latest_version": "v0.1.0",
"repository_url": "https://github.com/dirtyduck3712/ducklog",
"versions_count": 1,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": null,
"first_published_at": null,
"latest_published_at": "2026-07-18T06:32:26Z",
"latest_version_yanked": null,
"days_since_latest_publish": 5
},
{
"name": "github.com/dirtyduck3712/ducklog/zapsink",
"exists": true,
"license": null,
"keywords": [],
"ecosystem": "go",
"matches_repo": true,
"registry_url": "https://pkg.go.dev/github.com/dirtyduck3712/ducklog/zapsink",
"is_deprecated": false,
"latest_version": "v0.1.0",
"repository_url": "https://github.com/dirtyduck3712/ducklog",
"versions_count": 1,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": null,
"first_published_at": null,
"latest_published_at": "2026-07-18T06:32:26Z",
"latest_version_yanked": null,
"days_since_latest_publish": 5
}
]
},
"popularity": {
"forks": 0,
"stars": 0,
"watchers": 0,
"fork_history": {
"days": [],
"complete": true,
"collected": 0,
"total_forks": 0
},
"star_history": {
"days": [],
"complete": true,
"collected": 0,
"total_stars": 0,
"collected_at": null
},
"open_issues_and_prs": 0
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [],
"has_llms_txt": false,
"has_dockerfile": false,
"has_mcp_signal": false,
"bootstrap_files": [],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [
"client/go.mod",
"go.mod",
"zapsink/go.mod"
],
"largest_source_bytes": 7036,
"source_files_sampled": 40,
"oversized_source_files": 0,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"dependencies": {
"manifests": [
"client/go.mod",
"go.mod",
"zapsink/go.mod"
],
"advisories": {
"error": null,
"scope": null,
"source": null,
"findings": [],
"collected": false,
"malicious": [],
"truncated": false,
"by_severity": {},
"advisory_count": 0,
"affected_count": 0,
"assessed_count": 0,
"malicious_count": 0,
"assessed_package": null,
"unassessed_count": 0,
"direct_affected_count": 0
},
"ecosystems": [
"go"
],
"dependencies": [
{
"name": "github.com/mark3labs/mcp-go",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.48.0"
},
{
"name": "github.com/dirtyduck3712/ducklog/client",
"manifest": "zapsink/go.mod",
"ecosystem": "go",
"version_constraint": "v0.1.0"
},
{
"name": "go.uber.org/zap",
"manifest": "zapsink/go.mod",
"ecosystem": "go",
"version_constraint": "v1.27.1"
}
],
"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": 0,
"merged_prs": 0,
"open_issues": 0,
"closed_ratio": null,
"closed_issues": 0,
"closed_unmerged_prs": 0
},
"bus_factor": null,
"bot_contributors": 0,
"top_contributors": [],
"contributors_sampled": null,
"top_contributor_share": null
},
"quality_signals": {
"has_ci": false,
"has_tests": true,
"ci_workflows": [],
"has_docs_dir": true,
"linter_configs": [],
"has_editorconfig": false,
"has_linter_config": false,
"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": 0,
"reason": "branch protection not enabled on development/release branches",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": null,
"reason": "no pull request found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
},
{
"name": "CII-Best-Practices",
"score": 0,
"reason": "no effort to earn an OpenSSF best practices badge detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
},
{
"name": "Code-Review",
"score": 0,
"reason": "Found 0/30 approved changesets -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 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": null,
"reason": "no workflows found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 0,
"reason": "no update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 0,
"reason": "project is not fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 0,
"reason": "license file not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 0,
"reason": "project was created within the last 90 days. Please review its contents carefully",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
},
{
"name": "Packaging",
"score": null,
"reason": "packaging workflow not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
},
{
"name": "Pinned-Dependencies",
"score": 0,
"reason": "dependency not pinned by hash detected -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 0,
"reason": "no SAST tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 0,
"reason": "security policy file not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": null,
"reason": "no releases found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": null,
"reason": "No tokens found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
},
{
"name": "Vulnerabilities",
"score": 10,
"reason": "0 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "f9eb80fb1bb6a71b6264a760b14ff0434442432f",
"ran_at": "2026-07-23T16:43:52Z",
"aggregate_score": 2.1,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": false,
"has_dependabot_config": false
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-07-20T03:13:58Z",
"oldest_open_prs": [],
"last_merged_pr_at": null,
"ci_last_conclusion": null,
"oldest_open_issues": []
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/dirtyduck3712/Ducklog",
"host": "github.com",
"name": "Ducklog",
"owner": "dirtyduck3712"
},
"metrics": {
"overall": {
"key": "overall",
"band": "at_risk",
"name": "Overall health",
"note": null,
"notes": [],
"value": 31,
"inputs": {
"security": 21,
"vitality": 33,
"community": 12,
"governance": 39,
"engineering": 44
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "at_risk",
"name": "Vitality",
"value": 33,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "moderate",
"name": "Development activity",
"note": null,
"notes": [],
"value": 55,
"inputs": {
"commits_last_year": 93,
"human_commit_share": 1,
"days_since_last_push": 3,
"active_weeks_last_year": 2
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 3 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 3
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "2/52 weeks with commits",
"points": 1.4,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 2
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "93 commits in the last year",
"points": 17.7,
"status": "partial",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 93
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "project was created within the last 90 days. Please review its contents carefully",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "critical",
"name": "Release discipline",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 1,
"inputs": {
"releases_count": 0
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "no releases published",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_releases_published",
"params": {}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "no releases",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_releases",
"params": {}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "no releases",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_releases",
"params": {}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
}
]
},
{
"key": "abandonment",
"band": "excellent",
"name": "Abandonment",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"cap": null,
"state": "unverified",
"guards": [],
"signals": [],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": "repository_too_young",
"unanswered_open_prs": null,
"unanswered_open_issues": null,
"days_since_last_merged_pr": null,
"days_since_last_human_commit": null,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "maintenance record not established from the collected data",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_unverified",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "critical",
"name": "Community & Adoption",
"value": 12,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "critical",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 1,
"inputs": {
"forks": 0,
"stars": 0,
"watchers": 0,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "0 stars",
"points": 0,
"status": "missed",
"details": [
{
"code": "stars",
"params": {
"count": 0
}
}
],
"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": "critical",
"name": "Community health",
"note": null,
"notes": [],
"value": 25,
"inputs": {
"has_readme": true,
"has_license": false,
"has_contributing": false,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "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": 0,
"status": "missed",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 13.5
},
{
"key": "issue_template",
"name": "Issue template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.2
},
{
"key": "pr_template",
"name": "PR template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.3
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "at_risk",
"name": "Sustainability & Governance",
"value": 39,
"weight": 0.24,
"metrics": [
{
"key": "responsiveness",
"band": "critical",
"name": "Issue & PR responsiveness",
"note": "Excluded from scoring (no data or not applicable): Issue resolution, PR acceptance. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"issue_resolution",
"pr_acceptance"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 1,
"inputs": {
"merged_prs": 0,
"open_issues": 0,
"closed_issues": 0,
"issue_closed_ratio": null,
"closed_unmerged_prs": 0
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "no issues or no data",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_issues_or_data",
"params": {}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "no decided pull requests or no data",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_decided_prs_or_data",
"params": {}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "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": 41,
"inputs": {
"followers": 3,
"owner_type": "User",
"is_verified": null,
"owner_login": "dirtyduck3712",
"public_repos": 8,
"account_age_days": 4159
},
"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 dirtyduck3712",
"points": 4.3,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 3,
"login": "dirtyduck3712"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "8 public repos, account ~11 yr old",
"points": 18.9,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 8
}
},
{
"code": "account_age_years",
"params": {
"years": 11
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "good",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 84,
"inputs": {
"packages": [
"github.com/dirtyduck3712/ducklog/client",
"github.com/dirtyduck3712/ducklog/zapsink"
],
"ecosystems": "go",
"any_deprecated": false,
"min_days_since_publish": 5
},
"components": [
{
"key": "published_resolvable",
"name": "Published & resolvable",
"detail": "2 package(s) on go",
"points": 25,
"status": "met",
"details": [
{
"code": "packages_published",
"params": {
"count": 2,
"ecosystems": "go"
}
}
],
"max_points": 25
},
{
"key": "publish_recency",
"name": "Publish recency",
"detail": "latest publish 5 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 5
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "1 published versions",
"points": 4,
"status": "partial",
"details": [
{
"code": "published_versions",
"params": {
"count": 1
}
}
],
"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": "at_risk",
"name": "Engineering Quality",
"value": 44,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "at_risk",
"name": "Engineering practices",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_ci_tests"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 30,
"inputs": {
"has_ci": false,
"has_tests": true,
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 24
},
{
"key": "tests_present",
"name": "Tests present",
"detail": null,
"points": 24,
"status": "met",
"details": [],
"max_points": 24
},
{
"key": "linter_config",
"name": "Linter config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 16
},
{
"key": "pre_commit_hooks",
"name": "Pre-commit hooks",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 9.6
},
{
"key": "editorconfig",
"name": ".editorconfig",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.4
},
{
"key": "openssf_scorecard_ci_tests",
"name": "OpenSSF Scorecard: CI-Tests",
"detail": "no pull request found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "moderate",
"name": "Documentation",
"note": null,
"notes": [],
"value": 65,
"inputs": {
"topics": [],
"has_wiki": true,
"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": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "critical",
"name": "Security",
"value": 21,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "critical",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): CI-Tests, Dangerous-Workflow, Packaging, Signed-Releases, Token-Permissions. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"ci_tests",
"dangerous_workflow",
"packaging",
"signed_releases",
"token_permissions"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 21,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 13,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 5,
"scorecard_aggregate": 2.1
},
"components": [
{
"key": "binary_artifacts",
"name": "Binary-Artifacts",
"detail": "no binaries found in the repo",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "branch_protection",
"name": "Branch-Protection",
"detail": "branch protection not enabled on development/release branches",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "no pull request found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 2.5
},
{
"key": "cii_best_practices",
"name": "CII-Best-Practices",
"detail": "no effort to earn an OpenSSF best practices badge detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "code_review",
"name": "Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 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": "no workflows found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "no update tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is not fuzzed",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file not detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "project was created within the last 90 days. Please review its contents carefully",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "packaging",
"name": "Packaging",
"detail": "packaging workflow not detected",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 5
},
{
"key": "pinned_dependencies",
"name": "Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "no SAST tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file not detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "No tokens found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "0 existing vulnerabilities detected",
"points": 7.5,
"status": "met",
"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": "moderate",
"name": "AI Readiness",
"value": 58,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "at_risk",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 1,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "no CLAUDE.md / AGENTS.md / editor rules",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_instructions",
"params": {}
}
],
"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": "93 of 93 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 93,
"sampled": 93
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "moderate",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 56,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [
"go.sum"
],
"has_dockerfile": false,
"typed_language": true,
"bootstrap_files": [],
"has_devcontainer": false,
"has_linter_config": false,
"typecheck_configs": [],
"agent_commit_share": 0,
"toolchain_manifests": [
"client/go.mod",
"go.mod",
"zapsink/go.mod"
],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "client/go.mod, go.mod, zapsink/go.mod (toolchain convention, no task runner)",
"points": 12.6,
"status": "partial",
"details": [
{
"code": "toolchain_convention",
"params": {
"files": "client/go.mod, go.mod, zapsink/go.mod"
}
}
],
"max_points": 18
},
{
"key": "automated_tests",
"name": "Automated tests",
"detail": null,
"points": 22,
"status": "met",
"details": [],
"max_points": 22
},
{
"key": "lint_format_config",
"name": "Lint / format config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 11
},
{
"key": "static_type_checking",
"name": "Static type checking",
"detail": "Go (statically typed)",
"points": 11,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "Go"
}
}
],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": "lockfile",
"points": 10,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "lockfile"
}
}
],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "no agent-authored commits among the last 93",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_authored_commits",
"params": {
"sampled": 93
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "no automated dependency updates observed",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_dependency_automation",
"params": {}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "excellent",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"primary_language": "Go",
"largest_source_bytes": 7036,
"source_files_sampled": 40,
"oversized_source_files": 0
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "Go (statically typed)",
"points": 45,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "Go"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "0/40 source files over 60KB",
"points": 55,
"status": "met",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 40,
"oversized": 0
}
}
],
"max_points": 55
}
]
}
],
"description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
}
],
"metrics_version": "1.13.0"
},
"warnings": [
"Contributor list unavailable",
"GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
],
"report_type": "repository",
"generated_at": "2026-07-23T16:43:56.778178Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/d/dirtyduck3712/Ducklog.svg",
"full_name": "dirtyduck3712/Ducklog",
"license_state": "absent",
"license_spdx": null
}