Звіт у форматі JSON машиночитний
{
"data": {
"repo": {
"topics": [
"llm",
"ollama",
"rag",
"local-llm",
"rag-local",
"semantic-search"
],
"is_fork": false,
"size_kb": 235779,
"has_wiki": true,
"homepage": "https://liliang-cn.github.io/agent-go/",
"languages": {
"Go": 4595630,
"CSS": 1769,
"HTML": 702,
"Makefile": 4466,
"JavaScript": 2302,
"TypeScript": 312710
},
"pushed_at": "2026-07-30T06:20:31Z",
"created_at": "2025-08-07T09:46:11Z",
"owner_type": "User",
"updated_at": "2026-07-30T06:20:40Z",
"description": "AI Agent SDK designed for Go developers",
"is_archived": false,
"is_disabled": false,
"license_spdx": "MIT",
"default_branch": "main",
"license_spdx_raw": "MIT",
"primary_language": "Go",
"significant_languages": [
"Go"
]
},
"owner": {
"blog": "https://me.superleo.app/",
"name": "Liang Li",
"type": "User",
"login": "liliang-cn",
"company": "Remote",
"location": "Chengdu, China",
"followers": 101,
"avatar_url": "https://avatars.githubusercontent.com/u/20553741?v=4",
"created_at": "2016-07-20T08:07:22Z",
"is_verified": null,
"public_repos": 45,
"account_age_days": 3662
},
"license": {
"state": "standard",
"spdx_id": "MIT",
"raw_spdx": "MIT",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v2.107.0",
"kind": "minor",
"published_at": "2026-07-30T06:22:15Z"
},
{
"tag": "v2.106.1",
"kind": "patch",
"published_at": "2026-07-30T04:08:39Z"
},
{
"tag": "v2.105.1",
"kind": "patch",
"published_at": "2026-07-19T01:57:30Z"
},
{
"tag": "v2.105.0",
"kind": "minor",
"published_at": "2026-07-10T12:57:13Z"
},
{
"tag": "v2.104.1",
"kind": "patch",
"published_at": "2026-07-10T12:46:56Z"
},
{
"tag": "v2.104.0",
"kind": "minor",
"published_at": "2026-07-10T12:38:44Z"
},
{
"tag": "v2.103.0",
"kind": "minor",
"published_at": "2026-07-10T12:20:09Z"
},
{
"tag": "v2.102.0",
"kind": "minor",
"published_at": "2026-07-10T11:34:44Z"
},
{
"tag": "v2.101.1",
"kind": "patch",
"published_at": "2026-07-10T07:30:10Z"
},
{
"tag": "v2.101.0",
"kind": "minor",
"published_at": "2026-07-10T01:56:26Z"
},
{
"tag": "v2.100.0",
"kind": "minor",
"published_at": "2026-07-09T13:11:28Z"
},
{
"tag": "v2.99.0",
"kind": "minor",
"published_at": "2026-07-06T11:07:17Z"
},
{
"tag": "v2.98.0",
"kind": "minor",
"published_at": "2026-07-06T10:39:27Z"
},
{
"tag": "v2.97.0",
"kind": "minor",
"published_at": "2026-07-06T10:25:05Z"
},
{
"tag": "v2.96.1",
"kind": "patch",
"published_at": "2026-07-06T08:33:08Z"
},
{
"tag": "v2.94.0",
"kind": "minor",
"published_at": "2026-06-28T02:32:46Z"
},
{
"tag": "v2.92.0",
"kind": "minor",
"published_at": "2026-06-25T01:53:54Z"
},
{
"tag": "v2.89.0",
"kind": "minor",
"published_at": "2026-06-20T01:14:20Z"
},
{
"tag": "v2.88.0",
"kind": "minor",
"published_at": "2026-06-17T01:29:31Z"
},
{
"tag": "v2.87.0",
"kind": "minor",
"published_at": "2026-06-14T07:51:04Z"
},
{
"tag": "v2.86.0",
"kind": "minor",
"published_at": "2026-06-13T11:14:38Z"
},
{
"tag": "v2.85.0",
"kind": "minor",
"published_at": "2026-06-13T11:02:21Z"
},
{
"tag": "v2.83.1",
"kind": "patch",
"published_at": "2026-06-13T09:55:00Z"
},
{
"tag": "v2.83.0",
"kind": "minor",
"published_at": "2026-06-13T04:32:05Z"
},
{
"tag": "v2.82.0",
"kind": "minor",
"published_at": "2026-06-13T04:00:56Z"
},
{
"tag": "v2.81.0",
"kind": "minor",
"published_at": "2026-06-13T01:50:16Z"
},
{
"tag": "v2.80.0",
"kind": "minor",
"published_at": "2026-06-05T03:42:03Z"
},
{
"tag": "v2.79.1",
"kind": "patch",
"published_at": "2026-05-31T11:41:32Z"
},
{
"tag": "v2.79.0",
"kind": "minor",
"published_at": "2026-05-30T15:11:26Z"
},
{
"tag": "v2.77.1",
"kind": "patch",
"published_at": "2026-05-30T08:18:26Z"
},
{
"tag": "v2.77.0",
"kind": "minor",
"published_at": "2026-05-30T07:37:15Z"
},
{
"tag": "v2.76.0",
"kind": "minor",
"published_at": "2026-05-30T06:38:35Z"
},
{
"tag": "v2.74.0",
"kind": "minor",
"published_at": "2026-05-16T00:58:56Z"
},
{
"tag": "v2.73.0",
"kind": "minor",
"published_at": "2026-05-15T01:28:01Z"
},
{
"tag": "v2.72.0",
"kind": "minor",
"published_at": "2026-05-14T09:24:49Z"
},
{
"tag": "v2.71.0",
"kind": "minor",
"published_at": "2026-05-11T03:01:17Z"
},
{
"tag": "v2.70.0",
"kind": "minor",
"published_at": "2026-05-01T01:52:04Z"
},
{
"tag": "v2.68.1",
"kind": "patch",
"published_at": "2026-04-28T03:24:56Z"
},
{
"tag": "v2.67.0",
"kind": "minor",
"published_at": "2026-04-25T08:19:53Z"
},
{
"tag": "v2.66.3",
"kind": "patch",
"published_at": "2026-04-18T09:06:13Z"
},
{
"tag": "v2.66.2",
"kind": "patch",
"published_at": "2026-04-18T08:48:36Z"
},
{
"tag": "v2.66.1",
"kind": "patch",
"published_at": "2026-04-18T08:46:38Z"
},
{
"tag": "v2.66.0",
"kind": "minor",
"published_at": "2026-04-18T07:57:37Z"
},
{
"tag": "v2.65.0",
"kind": "minor",
"published_at": "2026-04-16T05:56:41Z"
},
{
"tag": "v2.64.0",
"kind": "minor",
"published_at": "2026-04-09T23:35:05Z"
},
{
"tag": "v2.63.0",
"kind": "minor",
"published_at": "2026-04-06T02:12:59Z"
},
{
"tag": "v2.62.0",
"kind": "minor",
"published_at": "2026-03-28T00:25:06Z"
},
{
"tag": "v2.61.0",
"kind": "minor",
"published_at": "2026-03-27T12:49:58Z"
},
{
"tag": "v2.60.0",
"kind": "minor",
"published_at": "2026-03-21T10:15:50Z"
},
{
"tag": "v2.57.0",
"kind": "minor",
"published_at": "2026-03-20T11:53:51Z"
},
{
"tag": "v2.56.1",
"kind": "patch",
"published_at": "2026-03-20T09:19:08Z"
},
{
"tag": "v2.52.0",
"kind": "minor",
"published_at": "2026-03-05T03:24:30Z"
},
{
"tag": "v2.51.0",
"kind": "minor",
"published_at": "2026-03-04T12:57:50Z"
},
{
"tag": "v2.49.0",
"kind": "minor",
"published_at": "2026-03-04T00:46:07Z"
},
{
"tag": "v2.48.0",
"kind": "minor",
"published_at": "2026-03-03T04:34:05Z"
},
{
"tag": "v2.47.0",
"kind": "minor",
"published_at": "2026-03-01T10:20:50Z"
},
{
"tag": "v2.44.0",
"kind": "minor",
"published_at": "2026-02-28T11:13:52Z"
},
{
"tag": "v2.43.0",
"kind": "minor",
"published_at": "2026-02-27T12:22:36Z"
},
{
"tag": "v2.42.0",
"kind": "minor",
"published_at": "2026-02-27T09:32:58Z"
},
{
"tag": "v2.41.2",
"kind": "patch",
"published_at": "2026-02-27T02:51:36Z"
},
{
"tag": "v2.41.1",
"kind": "patch",
"published_at": "2026-02-27T01:48:56Z"
},
{
"tag": "v2.41.0",
"kind": "minor",
"published_at": "2026-02-27T01:29:38Z"
},
{
"tag": "v2.40.0",
"kind": "minor",
"published_at": "2026-02-27T01:19:09Z"
},
{
"tag": "v2.36.0",
"kind": "minor",
"published_at": "2026-02-26T06:04:55Z"
},
{
"tag": "v2.35.0",
"kind": "minor",
"published_at": "2026-02-26T06:00:29Z"
},
{
"tag": "v2.34.0",
"kind": "minor",
"published_at": "2026-02-26T05:13:32Z"
},
{
"tag": "v2.33.0",
"kind": "minor",
"published_at": "2026-02-26T05:07:47Z"
},
{
"tag": "v2.32.0",
"kind": "minor",
"published_at": "2026-02-26T04:52:56Z"
},
{
"tag": "v2.31.0",
"kind": "minor",
"published_at": "2026-02-26T04:35:24Z"
},
{
"tag": "v2.30.0",
"kind": "minor",
"published_at": "2026-02-26T02:45:38Z"
},
{
"tag": "v2.29.0",
"kind": "minor",
"published_at": "2026-02-26T01:00:06Z"
},
{
"tag": "v2.28.1",
"kind": "patch",
"published_at": "2026-02-25T12:53:33Z"
},
{
"tag": "v2.26.0",
"kind": "minor",
"published_at": "2026-02-20T02:17:01Z"
},
{
"tag": "v2.25.2",
"kind": "patch",
"published_at": "2026-02-19T16:38:43Z"
},
{
"tag": "v2.25.1",
"kind": "patch",
"published_at": "2026-02-19T16:10:36Z"
},
{
"tag": "v2.24.0",
"kind": "minor",
"published_at": "2026-02-15T03:47:18Z"
},
{
"tag": "v2.21.1",
"kind": "patch",
"published_at": "2026-02-07T02:41:52Z"
},
{
"tag": "v2.20.2",
"kind": "patch",
"published_at": "2026-02-06T13:32:52Z"
},
{
"tag": "v2.20.1",
"kind": "patch",
"published_at": "2026-02-06T12:12:20Z"
},
{
"tag": "v2.20.0",
"kind": "minor",
"published_at": "2026-02-06T09:51:59Z"
},
{
"tag": "v2.12.0",
"kind": "minor",
"published_at": "2025-09-27T04:58:49Z"
},
{
"tag": "v2.11.0",
"kind": "minor",
"published_at": "2025-09-27T04:01:17Z"
},
{
"tag": "v2.10.0",
"kind": "minor",
"published_at": "2025-09-23T07:59:01Z"
},
{
"tag": "v2.9.3",
"kind": "patch",
"published_at": "2025-09-23T00:52:09Z"
},
{
"tag": "v2.9.2",
"kind": "patch",
"published_at": "2025-09-23T00:45:47Z"
},
{
"tag": "v2.8.1",
"kind": "patch",
"published_at": "2025-09-13T12:57:08Z"
},
{
"tag": "v2.8.0",
"kind": "minor",
"published_at": "2025-09-13T10:29:59Z"
},
{
"tag": "v2.7.6",
"kind": "patch",
"published_at": "2025-09-12T12:06:14Z"
},
{
"tag": "v2.7.5",
"kind": "patch",
"published_at": "2025-09-11T06:42:51Z"
},
{
"tag": "v2.6.1",
"kind": "patch",
"published_at": "2025-09-04T12:35:41Z"
},
{
"tag": "v1.8.1",
"kind": "patch",
"published_at": "2025-08-29T05:03:22Z"
},
{
"tag": "v1.6.2",
"kind": "patch",
"published_at": "2025-08-28T06:45:20Z"
},
{
"tag": "v1.6.1",
"kind": "patch",
"published_at": "2025-08-28T05:20:06Z"
},
{
"tag": "v1.6.0",
"kind": "minor",
"published_at": "2025-08-27T10:16:42Z"
},
{
"tag": "v1.5.4",
"kind": "patch",
"published_at": "2025-08-26T05:26:12Z"
},
{
"tag": "v1.5.3",
"kind": "patch",
"published_at": "2025-08-26T04:08:43Z"
},
{
"tag": "v1.5.2",
"kind": "patch",
"published_at": "2025-08-26T02:20:46Z"
},
{
"tag": "v1.5.1",
"kind": "patch",
"published_at": "2025-08-26T01:28:46Z"
},
{
"tag": "v1.3.0",
"kind": "minor",
"published_at": "2025-08-23T10:42:40Z"
},
{
"tag": "v1.2.0",
"kind": "minor",
"published_at": "2025-08-23T02:31:48Z"
}
],
"recent_commits": [
{
"oid": "dfef25699fadb1946dfca9e74e5317e3dbfd38fa",
"body": "… share it\n\n\"Every morning at eight, work out my stock returns and message me\" had no way\nto be expressed. pkg/scheduler could run a script, an MCP tool, a query or an\ningest — never the agent — so every application had to write the adapter\nitself.\n\nPromptExecutor is that adapter, and PromptSchedule\n[…]\nlist tasks,\nbut only one may execute them or everything runs twice. Start coupled opening\nthe store to starting the loop, leaving the process that does not own\nexecution unable to manage tasks at all.",
"is_bot": false,
"headline": "feat(scheduler): run an agent prompt on a cron, and let two processes…",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-07-30T06:20:16Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "060936252f7b4e0b4db9d5245c4eac6f14f61bab",
"body": "runDurableWorker ranged over a channel nothing ever closed, so the goroutine and\nits queue outlived every caller. In a long-lived process neither could be\nreclaimed. In tests it was worse: an agent run inside t.TempDir() would return,\nthe directory would be removed, and the worker would recreate fil\n[…]\nd failed when the rest of the suite competed for CPU. Close drains the queue,\nso the assertion needs no deadline at all.\n\ngo test ./... : four consecutive clean runs at 11s, from one-in-three failing.",
"is_bot": false,
"headline": "fix(memory): close the durable write queue, and stop leaking its worker",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-07-30T04:03:53Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "fd0a4b8f9464b76bcce21c4ea167f6b58375f87f",
"body": "release.yml pinned Go 1.24 while the module requires 1.25.0, so a release build\nwould have failed on the toolchain before reaching the tests. ci.yml already\nuses go-version-file; do the same here so the two cannot drift again.",
"is_bot": false,
"headline": "ci: read the Go version from go.mod when releasing",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-07-30T03:48:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "eebee86eecdff2ba17e4e130007db6a995fbd6fc",
"body": "`go test ./pkg/...` took over three minutes. All of it was here: the docker\nsandbox tests skip only when no daemon is reachable, so on a machine with\nDocker running they pull alpine, start a container, and allow themselves a\n60-second context — while on a machine without Docker they skip and the cost\nis invisible. That is the worst arrangement of the two.\n\nGate them on AGENTGO_DOCKER_TEST=1. The suite now finishes in 11 seconds.\n\n\tAGENTGO_DOCKER_TEST=1 go test ./pkg/sandbox/ -run Docker",
"is_bot": false,
"headline": "test(sandbox): make the docker tests opt-in",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-07-30T03:45:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8ae1e579edd2371699f51681e27bcc5835572158",
"body": "A finished conversation read back as a list of questions with no answers. Two\nseparate faults in the streaming path, both visible with a single ask:\n\n- The question was stored twice. The run adds the user's goal to the session up\n front, then completeRun hands persistMessages the messages it sent t\n[…]\ncopy's own length.\n\nVerified against a fake provider: one ask now stores exactly one question and\none reply, and two overlapping asks on one session store all four turns in\norder rather than one pair.",
"is_bot": false,
"headline": "fix(runtime): store the reply, and store the question once",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-07-30T03:45:37Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "536a4c1b86efbba52cbc4f073bedf35e568c10ba",
"body": "GetSession builds a fresh Session from the database on every call, so two runs\non the same id hold independent copies, and SaveSession writes each copy's\nwhole message list. The second save wins. Two overlapping asks left a history\nof \"user: B, user: B\" with the first question and both answers gone.\n[…]\ntores its question twice and its reply not at\nall, so assistant turns are still missing after concurrent runs; Runtime's\ncompleteRun persists history through a different route than session.AddMessage.",
"is_bot": false,
"headline": "fix(store): stop concurrent runs on one session from erasing each other",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-07-30T03:23:36Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "855a54d4b30a7177d76e3c30551da7233c051cd1",
"body": "…rn value\n\nA PTC turn answered with raw JSON. Two places treated machine-facing text as\nthe final answer:\n\n- terminalAnswerFromToolRound lets a script's return value stand as the reply\n and skip the summarising round. isMeaningfulAnswerText was the only gate and\n rejected just \"done\" / \"task compl\n[…]\ns code block and the\ntrailing tag the system prompt asks for. 5 provider calls vs 8 without PTC,\n39,957 prompt tokens vs 96,614, and 26.8s vs 33.4s — so it is now cheaper and\nfaster, not just cheaper.",
"is_bot": false,
"headline": "fix(ptc): reply to the user instead of handing over the script's retu…",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-07-30T03:23:25Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "52193dc4909da2baaef8789244f728538b75c67b",
"body": "…able\n\nThe PTC router discovers MCP tools and skills by duck-typing the services it\nis handed, falling back to the list captured at Build time when the method is\nmissing. Neither mcpToolAdapter nor skills.Service had it, so anything\ninstalled mid-conversation was invisible to the model: installed, p\n[…]\nrver needing a credential started without it — up and unable to do\nanything — even when the caller had persisted env for the next launch. Add\nAddDynamicServerWithEnv; the old signature forwards to it.",
"is_bot": false,
"headline": "fix(ptc,mcp): make a server or skill installed at runtime actually us…",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-07-30T03:23:13Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "347a28e5e3f9eeeaf41501ce2b9d23d069af38f2",
"body": "The input guardrail seam lives in Runtime, so it only covered the\nconversation turn. The planner reaches the model directly — RecognizeIntent\nembeds the user's goal in a prompt and calls GenerateStructured — and that\npath never passed through the seam. Captured request bodies during a turn\nwith reda\n[…]\nrvice.redactInputMessages and Runtime.applyInputGuardrails were\n near-identical walks over the same data; the planner gap is what\n duplication like that turns into. One implementation, two wrappers.",
"is_bot": false,
"headline": "fix(guardrails): enforce PII redaction at the provider boundary",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-07-30T03:23:01Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e401891bf1b9004735535af9bc57f7b537b5c472",
"body": "A chat-only gateway (no /embeddings) made every memory/RAG embed 404. Now\nembedding uses ONLY dedicated embedding providers; with none configured it is\ncleanly disabled (vector memory/RAG degrade; text chat/tools/skills unaffected)\nand a one-time stderr hint tells you how to add one. Prevents the noisy\n'RAG embedding API returned 404' the model would otherwise surface.",
"is_bot": false,
"headline": "fix(pool): don't reuse chat/LLM providers as an embedding backend",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-07-19T01:54:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "452a72db1aa3d00f8808797582ab824c7220a6a8",
"body": "Sub-agent model turns now route through the same input guardrails as the main\nruntime (Service-level redactInputMessages + redactWithGuardrails in\nguardrail_service.go). Only what's sent to the provider is scrubbed; state\nhistory is untouched; a block stops the sub-agent. Closes the gap noted in\nv2.104.x where subagent.go bypassed the guardrail seam.",
"is_bot": false,
"headline": "feat(agent): apply PII/guardrail redaction on the sub-agent LLM path",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-07-10T12:55:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "641b58baf493e192a528f56b3c7db5c82173b815",
"body": "service.go calls OutputLintRegistry.RemoveByName but the definition was left\nuncommitted, breaking 'go vet' on main (CI red at v2.104.0). Land the method +\nits test.",
"is_bot": false,
"headline": "fix(agent): commit RemoveByName lint-registry method used by service.go",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-07-10T12:44:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9e03ec7c35cb50a6c06efdf55ae33e442c308b2d",
"body": "… (default off)\n\n- guardrails_pii: NewPIIGuardrail with email/US-phone/CC/SSN + 中国身份证(校验位)/\n 手机号/银行卡(Luhn)/护照/IPv4; RedactMask/Partial/Hash/Block modes; overlap\n resolution + false-positive gating.\n- Service.RegisterGuardrail/Guardrails + GuardrailChain wired at three runtime\n seams: INPUT (redac\n[…]\nsisted history/session keep\n the original; only what's sent to the provider is scrubbed. nil chain = zero cost.\n- Builder.WithGuardrails / WithPIIRedaction(...PIIOption). Default OFF.\n- examples/pii.",
"is_bot": false,
"headline": "feat(agent): wire guardrail layer into runtime + strong PII redaction…",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-07-10T12:38:15Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "a7f3049834d0b64590fe0f7cf8c4e4ff2282cdb6",
"body": "… export_document + ocr_image tools\n\n- fileproc: Document.PageTexts, WithPages(\"1-8,50\"), ParsePageSpec; Extract(path)\n streams big PDFs via pdf.Open (no 50MB cap, 127MB works); pptx slide selection.\n- read_document: pages/per_page params + sandbox workspace path resolution for\n large files (strea\n[…]\nading bytes).\n- export_document tool: one-shot extract(pages) -> write .md/.txt via sandbox.\n- ocr_image tool + WithOCR/RegisterOCRTool: local OCR via ollama (default glm-ocr).\n- examples/docpipeline.",
"is_bot": false,
"headline": "feat(fileproc): PDF page selection + per-page + large-file streaming;…",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-07-10T12:19:41Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "af13f69abd44eaa75cd9c33a00c78d01b8c90319",
"body": "…ault background task)\n\nThe background 'subconscious' pool no longer auto-starts in NewService — the\nframework now spawns no background LLM task by default. Opt in with\nBuilder.WithSubconscious() or Service.StartSubconscious(). Enqueue is a no-op\nwhile unstarted, so memory-enabled services no longer pay a background LLM call\nper run unless requested. Also removes the recurring 'Subconscious worker pool\nstarted' log noise.",
"is_bot": false,
"headline": "feat(agent)!: subconscious memory-extraction worker is opt-in (no def…",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-07-10T11:34:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6d201ca535f15e2fdaa99575f5c6861a3f1b0828",
"body": "…reate\n\n- failAsyncTask: never overwrite a terminal task status (a concurrent\n CancelTask could land first and get clobbered to 'failed')\n- ensureMemoryBucket: tolerate UNIQUE-constraint loss in the concurrent\n GetSession/CreateSession race (fixes TestCortexDB_ConcurrentStoreAndSearch)\n- TestTaskServiceFacade: deterministic cancel assertion — wait out the\n doomed resume runner instead of racing it",
"is_bot": false,
"headline": "Fix CI test races: cancelled-vs-failed overwrite, concurrent bucket c…",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-07-10T06:59:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "21e868a7445853a8e74750bf4bc4d2413b81e0ac",
"body": "- Add MIT LICENSE file (README already claimed MIT) + license badge\n- Bump charmbracelet/x/cellbuf pre-release pin to v0.0.15, fixing\n 'go build ./...' failure against x/ansi (now v0.11.5)",
"is_bot": false,
"headline": "Add MIT LICENSE, fix cellbuf dependency build break",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-07-10T06:35:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cc0e359e4099825fd036410202b3037e8d60b252",
"body": null,
"is_bot": false,
"headline": "Polish README with badges, move dev notes to docs/dev, fix CI Go version",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-07-10T06:12:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f2c5be96a20425942aee98a67f8b19e6c3619e11",
"body": "…treaming runs\n\nAttach image (or arbitrary MessagePart) content to the initial user turn so\nvision-capable providers see it alongside the goal text. Honored on the\nRunStream/RunStreamWithOptions path.",
"is_bot": false,
"headline": "feat(agent): WithInputImages/WithInputParts for multimodal input on s…",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-07-10T01:55:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "341965a0a00aa7d8887eb78142b4cc118ea45968",
"body": "- pkg/fileproc: CGO-free Extract/ExtractBytes with format auto-detect (ext + magic\n bytes). docx/pptx via archive/zip+xml (zero-dep), xlsx via excelize (BSD), pdf via\n dslipak/pdf (MIT), images via std image + x/image (width/height + base64 data_uri\n for vision; no OCR). 50MB zip-bomb cap, WithMa\n[…]\n{ok,format,text,chars,truncated,metadata,error}; sandbox-aware\n path resolution (reads via svc.Sandbox() when attached).\n- examples/fileproc (offline, generates + extracts each format). No AGPL deps.",
"is_bot": false,
"headline": "feat(fileproc): document reading tool for docx/xlsx/pptx/pdf/images",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-07-09T13:10:36Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "a7a3feffd962190a0e32a43fe3284c7a77d6fe3f",
"body": "…t model turns\n\n- examples/deep-research: coordinator plans (TaskPlan.Validate, incl. a cycle-catch\n demo) -> 3 parallel worker sub-agents research via canned web_search/fetch_url\n tools -> MergeEvents/Concat aggregate -> synthesizer writes report.md in a sandbox.\n Provider read from env (LLM_BAS\n[…]\nkTerminal no longer surfaced to OnModelEnd as an\n error (stopped painting the final LLM span red in Phoenix).\n- Verified end-to-end live against gpt-5.5 -> Phoenix: chain root + agent/llm/tool spans.",
"is_bot": false,
"headline": "feat(examples): deep-research multi-agent showcase + observe sub-agen…",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-07-06T11:06:25Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "71a9d6563f631fa1fb71823d404d2ee7b30bc4bb",
"body": "…rver -> Arize Phoenix\n\n- pkg/otelobserver maps agent.Observer callbacks to OTel spans with OpenInference\n semantic conventions (openinference.span.kind CHAIN/LLM/TOOL/AGENT, llm.token_count,\n tool.name, input/output.value). Lazy root span per task, closed on OnCheckpoint;\n children nest correctl\n[…]\nserver; pkg/agent stays dependency-free.\n- examples/tracing (offline mock, exits 0 with Phoenix up or down).\n- Verified end-to-end against a live Phoenix: chain root + llm + tool spans nest correctly.",
"is_bot": false,
"headline": "feat(otelobserver): OpenTelemetry/OpenInference exporter for the Obse…",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-07-06T10:38:47Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c238d247a5f090c820a864279521b4a19fc76e17",
"body": "…ge primitives\n\n- Observer interface (OnModel/Tool/SubAgent/Checkpoint start/end + deltas) with\n BaseObserver no-op + composable registry + WithObserver; wired at the model,\n tool, subagent, and checkpoint kernel seams. Built-in NewTracingObserver drives\n the previously-dead Tracer so trace_expor\n[…]\nself deps, dup IDs;\n wired into TaskPlanService.Create.\n- stream.go: MergeEvents / generic Merge / Concat / Box / Tee fan-in primitives.\n- examples/observer, examples/stream (offline, deterministic).",
"is_bot": false,
"headline": "feat(agent): unified Observer layer, TaskPlan.Validate, streaming mer…",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-07-06T10:24:03Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "3b2d60e89698e364e550b89b4dd5c07b2071d580",
"body": "…n don't block Wait\n\nexec.CommandContext's default cancel SIGKILLs only the leader pid; on Linux a\nforked child (e.g. sh -c \"sleep 10\") survives in the process group, keeps the\nstdout pipe open, and blocks cmd.Run() for the full command duration — the\ntimeout never appears to fire (flaky TestLocalExecTimeout on CI). Wire cmd.Cancel\nto kill the whole group and set cmd.WaitDelay to bound the post-kill I/O drain.",
"is_bot": false,
"headline": "fix(sandbox): kill process group on Exec timeout so lingering childre…",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-07-06T08:45:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c3770220f503d822fd1874566247567a7f6b349b",
"body": "No API breakage; cortexbridge/store/rag/router build clean, full test suite green.",
"is_bot": false,
"headline": "chore(deps): bump cortexdb v2.24.1 -> v2.45.0",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-07-06T08:30:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2a6af08b4365131cf66775a2c113b0551a052c34",
"body": "…cuting\n\nA tool flagged ReadOnly, called again with identical arguments in the same turn,\ncannot return anything new. Re-executing wasted a backend round-trip and let a\npoorly-converging model spin (re-polling every resource status). Reuse the prior\nresult (already in context) for ReadOnly tools; non-read-only tools still\nre-execute (stateful re-reads, counters).",
"is_bot": false,
"headline": "fix(agent): collapse duplicate read-only tool calls instead of re-exe…",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-07-03T09:52:08Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1aa7ad24094454b6478a10df9cbe7c2ec1f8f56b",
"body": "…t ctx\n\ncreateStdioTransport bound the server subprocess to the caller's connect ctx via\nexec.CommandContext(ctx). Callers that wrap Connect in a WithTimeout ctx and\ncancel it after the initialize handshake (the common pattern) killed the process\nimmediately after tools/list, so every later tools/call failed with\n\"connection closed: EOF\". Bind the subprocess to a client-owned context instead,\ncancelled in Close().",
"is_bot": false,
"headline": "fix(mcp): keep stdio subprocess alive for client lifetime, not connec…",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-07-03T08:53:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "61503af1b19c3a96bf335e41d7cee3bef019089b",
"body": "…contract\n\nThe cross-framework benchmark runner now seeds a file 'database' (EVAL_FILES /\nTASK_SEED), reads the task via eval-go's EVAL_* env vars (falling back to TASK_*),\nraises the turn budget for multi-step tasks, and captures the final workspace into\nthe sample context so an LLM judge can grade against actual end state. Lets\neval-go's 'evalgo bench' drive agent-go as an ExecTarget.",
"is_bot": false,
"headline": "feat(examples): eval-bench seeds workspace + speaks eval-go's EVAL_* …",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-28T02:45:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6f29f43b8e194699d2d15cece49204b7bdea15ca",
"body": "…mple\n\n- pkg/worktree: dependency-free git worktree lifecycle (Create/Remove/IsClean/RemoveIfClean/Available)\n- agent.WithSubAgentWorktree(repoDir, ...): run a subagent with its fs/bash tools rooted in an isolated git worktree; auto-clean unless dirty\n- examples/loop: scheduler -> worktree subagent -> output-lint verifier -> checkpoint -> human gate (yield/resume) -> done, offline MockLLM",
"is_bot": false,
"headline": "feat(agent): git-worktree isolation for subagents + runnable loop exa…",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-28T02:32:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "074dec752108259696f5c21b9142205d9f9fc8fe",
"body": "…eful duplicate calls\n\n- PTC (JS tool-orchestration sandbox) is now OFF by default in agent.New();\n opt in via WithPTC(). Avoids the Goja .trim() crash on plain tool tasks.\n- Tool errors are fed back to the model as 'Error: ...' tool results instead\n of aborting the whole Run, so the model can rec\n[…]\nanswer.\n- Add examples/eval-bench: cross-framework benchmark runner emitting eval-go\n Samples. All three frameworks (miniagent/agent-go/harness-rs) now pass the\n baseline/sum3/counter/recover tasks.",
"is_bot": false,
"headline": "fix(agent): PTC off by default; recover from tool errors; re-run stat…",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-27T14:21:10Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e7e8095e157599aa6f6270c03220e2546d4a9121",
"body": "Add llm.NewOpenAI / NewOpenAIFromEnv / NewOpenAIEmbedder / NewOpenAIEmbedderFromEnv\nand Service.Ask, so callers can build a ready LLM or embedder against any\nOpenAI-compatible endpoint in a single call without touching the provider/pool\nplumbing. Backward compatible, additive only.",
"is_bot": false,
"headline": "feat(llm): one-liner OpenAI-compatible client + embedder constructors",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-25T01:53:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0c9dc9f6e487bc7b40f8767c890ba9aa3284161d",
"body": "RunStream aborted the LLM stream the instant a task_complete tool call\nappeared, but OpenAI-compatible providers stream tool-call arguments as\nfragments — the first chunk carries the name with incomplete/unparseable\nJSON args, so the extracted result was empty. The early errTaskTerminal\ndropped the \n[…]\n non-empty result before terminating; if they never do, the stream\nends naturally and the post-turn terminal handler recovers from the full\nresult. Fixes empty RunStream answers for tool-using agents.",
"is_bot": false,
"headline": "fix(agent): don't abort stream on task_complete before its args finish",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-20T05:25:57Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "020ddbb8bb30bc20796cba46daa0d38bf5ffed38",
"body": "The task_complete tool's `result` parameter was described as \"The final\nsummary/result of the task\". The word \"summary\" led models to occasionally\npass a third-person description of their work (e.g. \"Provided a step-by-step\nguide…\") instead of the answer itself, which is then shown to the user\nverbatim as FinalResult.\n\nReword the tool + parameter description to require the complete, final answer\nwritten directly to the user (second person), explicitly forbidding a\nmeta-summary of the work done.",
"is_bot": false,
"headline": "fix(agent): task_complete result must be the verbatim user answer",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-20T02:55:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "173d7f980f0082e813762c2f7a2c716f63971524",
"body": "…lls/HasSkill/MissingSkills) + WithRequiredSkills fail-fast",
"is_bot": false,
"headline": "feat(agent): skills-installed detection (SkillsInstalled/InstalledSki…",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-20T00:59:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "edaa2f72487f4cd51ba7cfacd348d960200ec4eb",
"body": "…rt/CDC + PII desensitization) as agent tools\n\n- RegisterImportFlow + NewImporter + JSONGeneratorFromLLM (driver-free CSV/dump import into RAG+KG, LLM-inferred mapping)\n- RegisterToolbox generic registrar; importflow_plan/run + connector_* metadata\n- connectorbridge sub-package isolates live-DB connector's heavy SQL/CDC deps\n- example: examples/cortex-data-import",
"is_bot": false,
"headline": "feat(cortexbridge): expose cortexdb importflow + connector (data impo…",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-16T16:36:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "90aa27cdeb1f6bd0655e275c52d191872b19f4e6",
"body": "…text v0.36.0)",
"is_bot": false,
"headline": "chore(deps): bump cortexdb v2.21.0 -> v2.24.1 (+openai-go v3.39.0, x/…",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-16T16:24:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "905f67d86f5ecd4120efc4dc6748907756135f6a",
"body": "…li, stray example binaries)",
"is_bot": false,
"headline": "chore: gitignore tool/build artifacts (.playwright-mcp, .antigravityc…",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-14T07:44:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0347694521081b6f44d73761e711706019ca55b2",
"body": "… final violation on budget exhaustion",
"is_bot": false,
"headline": "fix(eval): count lint violations across new retry+block wording; emit…",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-14T07:44:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d2991df48f3a7f2a4cc504a35643c2e66f4a94bd",
"body": null,
"is_bot": false,
"headline": "style(examples): gofmt autonomous-agent prompt string",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-14T07:37:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ae23bebbf3d20b80347aee117f520270f58fde5e",
"body": "…url for research tasks",
"is_bot": false,
"headline": "feat(claw): render lint retries as soft nudge (not error); add fetch_…",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-14T03:43:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5e0c94c247b64eaa7632c095000cf4e77c8e9fb9",
"body": "…pty-file writes); lint retries emit a soft marked event",
"is_bot": false,
"headline": "fix(agent): bash returns ok:false on non-zero exit (no more silent em…",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-14T03:43:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e24dd15f8da82caef15e005d8048ae9b96e6ee7c",
"body": "…ptc_inner events",
"is_bot": false,
"headline": "feat(claw): show PTC inner tool calls live (↳ fs_write/bash/...) via …",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-14T03:22:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3cceb40c595373568820553bfdd17e58476a0b6e",
"body": "…rkspace; print location on exit",
"is_bot": false,
"headline": "feat(claw): default to a persistent ~/.agentgo/workspace/claw/<ts> wo…",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-14T03:16:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "af9034c27418eb4343924ae6c467af5d453676a8",
"body": "…values as JSON not Go map; lint counts bash/shell as writers",
"is_bot": false,
"headline": "fix(ptc): toolOk recognizes {ok} shape; render structured PTC return …",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-14T03:13:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9b459aa79229585774272aae452ac8ff51ada143",
"body": "…eliverables",
"is_bot": false,
"headline": "feat(cli): agentgo task artifacts — list/extract a task's workspace d…",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-14T03:08:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7597fefdd13300e75d16bfae3a9fa68a49d6f169",
"body": "…re on resume",
"is_bot": false,
"headline": "feat(agent): snapshot sandbox workspace into task checkpoints + resto…",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-14T03:08:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "38fd9ec5520b94d1a757865613ea6bb31aab1be1",
"body": "…ision+autonomy)",
"is_bot": false,
"headline": "feat(cmd): claw — interactive autonomous agent CLI (sandbox+browser+v…",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-14T02:56:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "622486f2f2b8fa8ef251f68683c195eb96bbce42",
"body": "…ite etc.",
"is_bot": false,
"headline": "fix(agent): record PTC inner tool calls so goal-aware lints see fs_wr…",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-14T02:56:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c1749a0cbd4300c5ef15a1ff3533c4bd25903502",
"body": "…tools replace it",
"is_bot": false,
"headline": "refactor(mcp): remove built-in filesystem MCP; native pkg/sandbox fs …",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-14T02:27:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9d10f8f6a01b305a623268646be9e7bc2db8c855",
"body": "…write recognizes sandbox fs_write/fs_edit/fs_move",
"is_bot": false,
"headline": "feat(examples): streaming autonomous-cli; fix(agent): file_task_must_…",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-13T15:05:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b580e86f662f0d665b7ccaf49cbd564e7b3c8e18",
"body": "…olArgStringSlice)",
"is_bot": false,
"headline": "fix(agent): scratchpad_set accepts []string from PTC Goja sandbox (to…",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-13T14:58:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c3ebb6d69b8dd9d0e54df15762fc05f6484a65fb",
"body": "…xample",
"is_bot": false,
"headline": "feat(agent): vision image-part feedback + runnable autonomous-agent e…",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-13T14:49:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "91730c4d6698f16282372df372f7b6cc1a7e354a",
"body": "…utonomy/WithDeliverables",
"is_bot": false,
"headline": "feat(agent): builder options WithSandbox/WithBrowser/WithVision/WithA…",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-13T14:45:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2d401f7dff8fd6362199283668428f338bbd387a",
"body": null,
"is_bot": false,
"headline": "feat(agent): sandbox/browser/scratchpad/deliverable tools (35 tools)",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-13T14:39:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "31ada25e954aa9d98088cc0f43fee853cb733ba7",
"body": "… and chromedp browser",
"is_bot": false,
"headline": "feat(sandbox,browser): add pluggable execution sandbox (local+docker)…",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-13T14:32:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9b70f629b83379f1acd8df0badeaa23417decd30",
"body": null,
"is_bot": false,
"headline": "docs(manus): design spec for sandbox + browser + autonomy engine",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-13T14:22:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b066c20ad527d6209e9a0710bce51c694ace0a76",
"body": "Replace the local DashScope enable_search helper with agent.RegisterWebSearchTool\n(env: SUPERAI_SEARCH_BASE/KEY/MODEL, key defaults to SUPERAI_EMBED_KEY).",
"is_bot": false,
"headline": "feat(examples): superai uses built-in web_search (RegisterWebSearchTool)",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-13T11:13:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2ea008e5476c6a06356df895c05dc560838b78ef",
"body": "…ndpoint)\n\nagent.RegisterWebSearchTool(svc, WebSearchConfig{BaseURL, APIKey, Model}) adds a\nweb_search tool that calls a search-capable OpenAI-compatible chat endpoint,\nsending both DashScope enable_search and OpenAI-style web_search_options so\neither provider grounds the reply; asks for a concise, cited answer. No-op when\nunconfigured. agent.WebSearch is exported; request builder is unit-tested.",
"is_bot": false,
"headline": "feat(agent): built-in web_search tool (grounded, via search-capable e…",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-13T11:13:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "685d7897b076402e6756731f55e5067d9244a151",
"body": "…ia AI SDK data part\n\n- main.go: replace local fetch_url with agent.RegisterFetchURLTool.\n- web.go: /api/chat emits a custom AI SDK data part (data-meta) with emotion +\n tools; web UI renders them as chips under the assistant bubble.",
"is_bot": false,
"headline": "feat(examples): superai uses built-in fetch_url; tool/emotion chips v…",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-13T11:00:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "09f7d137de8e2b2c0196c34c47fc92854250b09a",
"body": "agent.RegisterFetchURLTool(svc) adds a fetch_url tool that GETs an http(s) page\nand returns its readable text (script/style + tags stripped, entities\nunescaped, whitespace collapsed, truncated). The \"read this specific page\"\ncounterpart to web search. SSRF guard refuses loopback/private/link-local\nhosts. agent.FetchURL is exported for direct use; htmlToText is unit-tested.",
"is_bot": false,
"headline": "feat(agent): built-in fetch_url tool (read a page's text, SSRF-guarded)",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-13T11:00:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cb1e34c22b276df3e48d2cdbdb7a638c29eb44ee",
"body": "- New web/ frontend: Vite + React + @ai-sdk/react useChat, embedded into the Go\n binary via go:embed web/dist. Streaming chat bubbles, AI-overview side panel,\n token gate, light/dark theme, new-session button.\n- /api/chat now speaks the AI SDK UI message stream protocol (start / text-start\n / tex\n[…]\nfinish / [DONE]); runs the agent and streams the\n emotion-stripped reply. Session via X-Session header, token via Authorization.\n- Build the UI with: cd examples/superai/web && npm i && npm run build",
"is_bot": false,
"headline": "feat(examples): superai web UI rebuilt with Vercel AI SDK (Vite/React)",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-13T10:43:50Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2c42d69b981c2a0c303c0bc0c2f47a93d25e44d9",
"body": "When a run requests native web search (WebSearchMode auto/native), the pool\nclient now sends both the OpenAI-style web_search_options AND DashScope's\nnon-standard enable_search:true. Providers ignore the flag they don't know;\napplyPoolRetryFallbacks already drops native web search (and now also matches\n\"enable_search\" rejection messages) if an upstream complains. No new config or\noptions — it rides the existing WebSearchMode.",
"is_bot": false,
"headline": "feat(pool): native DashScope enable_search alongside web_search_options",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-13T10:16:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6ff66a9fe3562b636ff0a022b3d855d41f7ab665",
"body": "Adds a web_search tool (real-time news/finance/facts) backed by DashScope's\nenable_search extension (OpenAI-style web_search_options is ignored by DashScope;\nenable_search:true is what triggers retrieval). Registered when a search key is\nconfigured (defaults to SUPERAI_EMBED_KEY); model calls it for fresh info.",
"is_bot": false,
"headline": "feat(examples): superai web_search tool via DashScope enable_search",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-13T10:12:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3608c8f0c4c99ea56a748252a5633f1d39a5c7ee",
"body": "Strict backends (OpenAI Responses/Codex, Anthropic, and proxies fronting them)\nreject a request that contains a function_call_output with no matching\nfunction_call (\"No tool call found for function call output with call_id X\").\nThese orphans appear when replayed session history or context compaction\n[…]\ned pure tool-call messages. It is a no-op when everything is already\npaired (the common live-turn path), and is applied at every GenerateWithTools /\nStreamWithTools call site so all providers benefit.",
"is_bot": false,
"headline": "fix(agent): sanitize tool_call/result pairing before provider calls",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-13T09:53:15Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "735995d9fc21047d68a453034aaa04272d1d7abb",
"body": "…iew, chat logs\n\n- Per-browser session id (localStorage) sent to /api/chat; backend resumes that\n session's history. Transcript persisted client-side and replayed on reload.\n- + button starts a fresh session (new id, cleared transcript).\n- Overview is generated at most once/day (server cache); ↻ forces regenerate;\n no longer regenerated after every message.\n- Log chat errors server-side (journalctl).",
"is_bot": false,
"headline": "feat(examples): superai resume session + new-chat button, daily overv…",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-13T09:47:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "30f4975c9b3c434844b0411012481814783d5f97",
"body": "…er in bubble\n\n- splitEmotion now peels a trailing 情绪: tag whether it sits on a real newline,\n a literal \\n the model emitted as text, or just appended (gpt-5.4 emits \\n).\n- Web: insert the tools/emotion meta into the bubble wrapper (.aiwrap), not the\n avatar div (querySelector('div') was hitting the avatar).",
"is_bot": false,
"headline": "fix(examples): superai strips literal-\\n emotion tag; tool chips rend…",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-13T09:28:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e3c2280f922028886333899799b3da7016131036",
"body": "…k theme\n\n- Right panel is now an AI-generated dashboard: GET /api/overview asks the brain\n to produce {sections:[{icon,title,items}]} from current data; the model decides\n the sections (即将到来/关系提醒/贴心建议…). Generated on load / after chat /\n manual refresh; empty store skips the LLM.\n- Light/dark theme toggle (persisted, respects prefers-color-scheme) via CSS vars.",
"is_bot": false,
"headline": "feat(examples): superai web — AI-generated overview panel + light/dar…",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-13T09:24:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8f3a9280fbf7fdb4fba70c7a1438b3bea25e60b8",
"body": "…ath)\n\nWithGraphMemory only sets the builder store type; MemoryPrimaryPath derives the\npath from the CONFIG store type (default file), so cortexdb tried to open the\nfile-memory directory and CANTOPENed when that dir already existed. Set\ncfg.Memory.StoreType = graphflow before ApplyHomeLayout so the path resolves to\ncortex.db. Surfaced deploying superai with DashScope embeddings.",
"is_bot": false,
"headline": "fix(examples): superai sets cfg store type for graph memory (cortex p…",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-13T09:15:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "da7620c8aaafce33253e65850b008324d208aeb9",
"body": "- Polished single-page UI (login gate, message avatars, tool/emotion chips,\n live side panel, reminder toasts) — still zero-build, embedded.\n- Optional SUPERAI_TOKEN: /api/* require Bearer token (or ?token= for SSE);\n page is public, API gated. /api/config tells the UI whether to show login.",
"is_bot": false,
"headline": "feat(examples): superai web UI redesign + token auth",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-13T09:02:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "47013e98ae1fa42e232e8620255fbb99d45c0a5c",
"body": "- SUPERAI_LLM_BASE/KEY/MODEL: drive SuperAI with any OpenAI-compatible endpoint\n (default DashScope Qwen). Verified against a sub2api proxy with gpt-5.4.\n- Embeddings optional (SUPERAI_EMBED_*); SUPERAI_EMBED_KEY=none falls back to\n file memory, so chat-only proxies (no /v1/embeddings) work too.",
"is_bot": false,
"headline": "feat(examples): superai brain is provider-agnostic, embeddings optional",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-13T08:47:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "124d56ab3ef0716cce208dfa1bc74c85a05dfb1c",
"body": "- net/http server + embedded single-page chat UI (no extra deps, no framework\n agentgo-ui coupling).\n- POST /api/chat, GET /api/state, GET /api/events (SSE) for proactive reminder\n push to the browser.\n- Disable PTC for superai turns: simple one-tool-per-intent flows now use clean\n direct tool-calling (fixes PTC summary leaking into replies + dropped args).",
"is_bot": false,
"headline": "feat(examples): superai web UI (-web)",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-13T06:30:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "adf00567419cc18046a8be5da47cbb7107dcf481",
"body": "…e reminders\n\n- Persistent state under SUPERAI_HOME (default ./.superai-data): graph memory\n (cortex.db) + a JSON-backed store survive restarts.\n- Interactive mode (-i): chat REPL with /state and /quit; Ctrl-C saves.\n- Proactive reminder scheduler (PRD S2): SuperAI speaks when a reminder is due\n (one-time RFC3339 or daily HH:MM).\n- SUPERAI_PROACTIVE_TEST=1 runs a token-free scheduler self-check.",
"is_bot": false,
"headline": "feat(examples): superai gains persistence, interactive chat, proactiv…",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-13T06:21:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bcdab890845c7f3e8d522b42782a0791bbc6da28",
"body": "- Task output schema now applies to team tasks too: submitTeamTaskWithSchema\n threads TaskSubmitOptions.OutputSchema into each dispatched member's run\n (force StructuredOutput + validate + retry). Previously single-agent only.\n- New baseline output lint no_raw_ptc_code: rejects final answers that leak\n raw PTC sandbox code (callTool/toolData/...) instead of the executed result;\n auto-registered for every framework-built service. Fixes the qwen-plus+PTC\n \"JS leaked into final text\" edge.",
"is_bot": false,
"headline": "feat(agent): team-task output schema + no_raw_ptc_code lint",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-13T04:30:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1b63787255e4f4689cc41867402d74cc181a0f9f",
"body": "…food v2.82.0)",
"is_bot": false,
"headline": "chore(examples): superai uses WithGraphMemory + resolve_datetime (dog…",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-13T04:18:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dfc226aa98f52bcf7721554a776205d584037b5d",
"body": "Let the agent loop query the cortex knowledge graph, not just enable it.\n\n- WithGraphMemory(): graph mode — graphflow store (entities+relations) AND\n registers the graph_recall tool so the model can query the KG in-loop.\n- Service.KnowledgeRecall(ctx, query, topK) -> domain.GraphRecallResult\n (ent\n[…]\n maps cortexdb's fused KnowledgeMemoryRecall.\n- memory.Service.KnowledgeRecall mirrors the same graph-or-fallback contract.\n\nTests: real graph path (pkg/store) + tool registration/routing (pkg/agent).",
"is_bot": false,
"headline": "feat(agent): knowledge-graph–aware mode + KnowledgeRecall API",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-13T03:59:17Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7c08a4a2d135fe3fba77160c11d273adaf0ca670",
"body": "Store / deployment:\n- Drop CGO sqlite (mattn) for pure-Go modernc in history & usage stores;\n CGO_ENABLED=0 now builds AND runs (no more silent CANTOPEN). Single-binary\n cross-compile is trivial.\n- NewStore / NewAgentGoDB / usage repo mkdir -p the parent dir.\n\nTeamManager:\n- RegisterAgentTool(agen\n[…]\ntool turns\n hijacked by the answer-from-memory shortcut.\n- Emit a progress event when a run produces structured output.\n\nExamples: operator-collab (multi-agent codex+claude), superai (PRD assistant).",
"is_bot": false,
"headline": "feat(agent): pure-Go store, closure tools + Task schemas, datetime tool",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-13T01:46:44Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "376a08585ec5844c830546fe6c87a5cadd806e26",
"body": "Adds agent.RunTyped[T](ctx, svc, goal, opts...): derives a JSON Schema from\nT (WithStructuredOutputType[T]), runs the agent, and returns a parsed T —\nthe typed counterpart to Service.Run, mirroring harness's run_typed. No more\nmanual json.Unmarshal(out.Content).\n\nNotably it routes through RunStream,\n[…]\n for robust parsing (handles code fences / prose).\nShips examples/structured-output/main.go (runnable, verified live end-to-end)\nand tests covering bare/fenced/prose JSON plus the non-JSON error path.",
"is_bot": false,
"headline": "feat(agent): RunTyped[T] — typed structured-output helper + example",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-05T03:38:14Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "25e6e7e25cfff3864109c598ef691655bcfc6808",
"body": "…\"unavailable\"\n\nStructured output failed against DeepSeek's thinking model because of two\nsequential rejections the single-shot retry couldn't clear:\n\n- The first call 400s on tool_choice (\"Thinking mode does not support this\n tool_choice\"); the one retry stripped tool_choice but kept response_form\n[…]\nasses), stripping whatever the current error complains about until the\ncall succeeds or nothing more can be dropped; and both the pool and OpenAI\nresponse_format matchers now also match \"unavailable\".",
"is_bot": false,
"headline": "fix(providers): iterate response_format/tool_choice fallbacks, match …",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-06-05T03:38:01Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "bf4323a3b0361c8df861bdd194acaf35646cab78",
"body": "Live was hardcoded Chinese and Tasks hardcoded English, so neither\nfollowed the 中文/EN toggle. Wire both through i18next:\n\n- i18n.ts: add en + zh keys for every Live and Tasks string (titles,\n run summary labels, history, pagination, table headers, status labels,\n search placeholder, tip).\n- App.ts\n[…]\nadges + filter chips translate via a statusKey() helper; the row\n .map() param was renamed task -> avoid shadowing the t() function.\n\nVerified both pages render correctly in EN and ZH via the toggle.",
"is_bot": false,
"headline": "i18n(ui): localize Live and Tasks pages (and their nav labels)",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-05-31T11:25:35Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "0fc74efe8e3deaded8b0c5ad17e81800a12b266c",
"body": "The /tasks list over-fetched the whole table (ListUnifiedTasks pulled\nmax(limit,1000) rows, sorted/trimmed in Go) and read every task's\nframes/events JSON blobs, so the page took ~3.4s with a few hundred tasks.\n\n- store: ListTasksPaged(TaskListFilter{Limit,Offset,Status,Search}) does\n ORDER BY crea\n[…]\n (debounced) search to the backend, pages via total.\n\nResult: /tasks dropped from ~3.4s to ~0.2s at 585 tasks. Adds a store test\ncovering pagination, status filter, search, and the filter-aware total.",
"is_bot": false,
"headline": "perf(tasks): SQL-level pagination + filtering for the task list",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-05-31T11:08:11Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5d339089f643c9b4442c3fccd4b24ad9a3c12a50",
"body": "Pure `go fmt ./...` output; no behavior change. Keeps the repo\ngofmt-clean so `make check` is a no-op on formatting.",
"is_bot": false,
"headline": "chore: gofmt (alignment + stray blank line)",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-05-30T15:09:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1526214574856c7ae774c2a932d80cf940154241",
"body": "Now that no_planning_only_finish is a global baseline lint, the old\n\"I will route ...\" mock replies trip it first (global lints run before\nagent-specific ones), so dispatcher_no_bounce_back never fired and two\nmock scenarios failed. Switch to \"Routing this/the task to ...\" phrasing,\nwhich trips dispatcher_no_bounce_back but not no_planning.",
"is_bot": false,
"headline": "test(eval): use routing phrases that trip only the dispatcher lint",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-05-30T15:08:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cecfc456ff004db4ea0f5e64de8c119bd302caae",
"body": "…synthesis\n\nPort two harness patterns so the runtime confirms the goal was reached\ninstead of trusting the model's self-declared \"done\".\n\n- file_task_must_write now verifies the RESULT, not the attempt: when the\n goal names a concrete path, the file must exist and be non-empty on disk\n (a write to\n[…]\nost is\n accrued; a cancelled run no longer fabricates a completion.\n\nReuses getHomeDir() for ~ expansion. Adds unit tests for path extraction\n(URL/source/relative excluded) and artifact verification.",
"is_bot": false,
"headline": "feat(agent): verify the goal at completion — artifact check + forced …",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-05-30T14:59:18Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f317555aa277bff95b64c1324fd8c1d027197763",
"body": "It's a TypeScript incremental-build cache regenerated on every UI build,\nso it churned in every diff.",
"is_bot": false,
"headline": "chore: stop tracking ui/tsconfig.tsbuildinfo, ignore *.tsbuildinfo",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-05-30T10:41:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0538767d172c3a1094e7aa4323fb3fb5a686578a",
"body": "…e file lint\n\nThe output-lint system was effectively dead in production: lints only\nran on the text-only completion round, while decision.Terminal, the PTC\nshort-circuit, and task_complete all completed without ever consulting\nthem. So no_planning_only_finish never fired and agents could finish on\na\n[…]\n to catch mid-sentence stalls (\"Great data! Let me check...\", \". Now let\n me use...\") while sparing acknowledgments (\"let me know\", \"我会记住\").\n- registry: dedup registration by lint name (idempotent).",
"is_bot": false,
"headline": "fix(agent): enforce output lints on every completion path + goal-awar…",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-05-30T10:39:36Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "78beaa569217e3a32510b677e0d159f2f6a97059",
"body": "A blacklisted-path tool error used to terminate the whole task\n(FilesystemPathBlockedError implemented BlockedReason()). That meant a\nsingle stray access to a blacklisted dir — e.g. the \".agentgo\" parent of\na workspace at ~/.agentgo/workspace — killed the run. Make it a normal,\nrecoverable tool erro\n[…]\nd retries with an\nallowed path. Also drop \"tmp\"/\"temp\" from the default ignore list so\nskills that stage intermediate files under /tmp work out of the box\n(still overridable via MCP.FilesystemIgnore).",
"is_bot": false,
"headline": "fix(mcp): make filesystem blacklist hits recoverable, allow /tmp",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-05-30T10:39:24Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "af9f0445402eb77213e9ed8f9bf0c9ae78376775",
"body": "…, settings button fix\n\n- new Markdown component (react-markdown + remark-gfm), styled to design tokens\n- Live: render streamed text + final answer as markdown; full Chinese localization\n- Agent: surface the dispatched agent's response (markdown) instead of discarding\n it; team dispatch shows the ack + a link to the async task\n- Settings: fix save/language buttons missing height + padding (cramped render)",
"is_bot": false,
"headline": "feat(ui): markdown rendering, agent response display, Live in Chinese…",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-05-30T08:56:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c4e140fa8c930bf0cc1b204a16b7fb4ff2222c7c",
"body": "The /api/tasks list endpoint hung (>10s) once a few hundred tasks\naccumulated: ListUnifiedTasks called hydrateUnifiedTask for every task,\nissuing one ListMessagesForTask query per row. The list view\n(TaskSummary) does not include message frames — only the detail endpoint\n(GetUnifiedTask) needs them. Skip hydration in the list path; with 469\ntasks the endpoint drops from >10s to ~0.8s.",
"is_bot": false,
"headline": "fix(agent): drop N+1 frame hydration from ListUnifiedTasks",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-05-30T08:56:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3eae228de73c995218da8d3dfbaadd2937bb0f79",
"body": "The lightweight \"运行\" page duplicated Live's streaming run with less\ndetail. Drop it: Live (full event timeline + cost + stop reason) is now\nthe only run view alongside the Agent management page.\n\n- delete ui/src/pages/Run.tsx\n- remove /run route + nav-run link in App.tsx\n- Tasks empty-state links to Live only\n- navigation.spec: nav-run -> nav-live",
"is_bot": false,
"headline": "refactor(ui): remove redundant Run page, Live is the sole run entry",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-05-30T08:16:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3b0a32c83be6779772dc82609a6051d2f00b8669",
"body": "…texdb bridge\n\n- pkg/rag/store: BM25-style keyword store for lexical retrieval\n- pkg/rag/processor: reciprocal rank fusion (RRF) to merge vector + keyword results\n- pkg/cortexbridge: bridge to cortexdb for vector/graph-backed memory\n- pkg/scheduler: background jobs runner\n- pkg/providers/openai: optional-param retry fallbacks\n- examples/cortexdb_kg: runnable knowledge-graph example",
"is_bot": false,
"headline": "feat(rag,scheduler): hybrid keyword+vector retrieval, RRF fusion, cor…",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-05-30T07:32:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b3894b611f0a128a2bdd6d6c130c214748c68ee1",
"body": "The wazero runtime never ran JavaScript on its own — it delegated JS to\nGoja internally (quickjs-emscripten was never wired up) and only added a\nWASM-binary path nobody used. Remove it entirely so PTC has a single,\nhonest runtime.\n\n- delete pkg/ptc/runtime/wazero (runtime, hostfuncs, jswasm, memory,\n[…]\n serve`\n- PTC.md: drop the WASM sandbox mention\n\nBREAKING CHANGE: pkg/ptc.RuntimeWazero, pkg/ptc.LanguageWasm,\nagent.PTCConfig.Runtime, and the CLI `--runtime` flag are removed. PTC\nruns on Goja only.",
"is_bot": false,
"headline": "refactor(ptc)!: remove wazero/WASM runtime, Goja only",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-05-30T06:32:34Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "441db267e58781f15092793537283c58d2b47bff",
"body": "Older DBs created shared_tasks with a captain_name column; the current\nschema and all reads/writes use orchestrator_name. The schema migration\nonly handled squad_id→team_id and squad_name→team_name, so inserts on a\npre-existing DB failed with \"table shared_tasks has no column named\norchestrator_name\". Add a captain_name→orchestrator_name step\n(rename-in-place, with add+backfill fallback) and a regression test.",
"is_bot": false,
"headline": "fix(store): migrate legacy captain_name column to orchestrator_name",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-05-30T06:32:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e377da9aad158b88f6aa36b6340b63d95bd550d8",
"body": "Replaces the bespoke sky-blue / glass-panel styling with a uniform\nshadcn/ui default (neutral) theme across every page. Removes all legacy\nCSS shim classes; nothing in the app references dashboard-button /\nglass-panel / nav-pill any more.\n\nFoundation\n- deps: class-variance-authority, clsx, tailwind-\n[…]\nry rail\n\nSemantic status colors (emerald/amber/rose/violet/indigo) are retained\nfor stop_reason, task status, and event types. tsc clean; build passes;\nverified across Agent/MCP/Chat/Tasks/Status/Run.",
"is_bot": false,
"headline": "feat(ui): migrate the whole Web UI to shadcn/ui + Radix (default theme)",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-05-30T03:01:20Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "eafaf0329238e3d9eae8fd0097afbca64b9ae5ec",
"body": "Adds three new pages and the supporting backend wiring so the\nagentgo-ui actually shows the work the framework has been doing —\ncheckpoints, replay, stop_reason, cost, structured outputs, the lot.\n\nUI (ui/src):\n- pages/Live.tsx (new): streams /api/agent/stream and renders a live\n timeline of thinki\n[…]\nified end-to-end against DeepSeek v4-flash on a local UI instance:\nLive view streams events; terminal task carries stop_reason=end_turn\nand est_cost_usd>0; persisted TaskStats has matching cost field.",
"is_bot": false,
"headline": "feat(ui,agent): surface v2.69-v2.74 harness features in the Web UI",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-05-16T04:33:30Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f17f07bd3455136b29184d73c75aa11cf175cfae",
"body": "Reading session.Messages directly without locking races with\nconcurrent AddMessage calls and crashes with an index-out-of-range\npanic when the underlying slice grows mid-iteration. The race had\nbeen latent and surfaced on CI under load when the lint-exhausted\nblock triggered persistMessages from one goroutine while the runtime\nappended a lint-feedback user message from another.\n\nSwitch to Session.GetMessages, which already takes an RLocked\ndefensive copy.",
"is_bot": false,
"headline": "fix(agent): copy session messages defensively in Store.SaveSession",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-05-16T00:54:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f8bbf660f70d3557d630c92b18b7f688d09deca7",
"body": "The block I added emits a terminal workflow_blocked event when the\nruntime's round budget is exhausted naturally. It correctly classifies\nthat outcome as StopReasonMaxTurns. But it introduced a regression\nunder CI's slower disk I/O for the cross-service async-resume test:\nwhen a second runtime start\n[…]\nssification, budget cap, lint exhaustion, stop hook) stays\nintact. A natural max_turns ending continues to close the event\nchannel cleanly, the same behavior agent-go has shipped with for a\nlong time.",
"is_bot": false,
"headline": "fix(agent): drop max_turns block at end of for-loop",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-05-16T00:49:21Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e530922863fcc88dd71582c8868ace668ed31286",
"body": "The 90s bump from d0c2958 still flaked on ubuntu-latest — the test\nhit the deadline almost exactly. Locally the same test resolves in\nunder a second. Doubling the budget so cold hosted runners with module\ncache miss + SQLite contention can finish. A proper fix would replace\nthe per-25ms polling with a notification channel from the store.",
"is_bot": false,
"headline": "test(agent): bump async-task wait timeout to 180s for CI",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-05-16T00:33:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c3b0b3c70ef9cb95d45632294d135d7a24e8d758",
"body": "Three intertwined harness pieces that finish off the Fowler \"harness\nengineering\" checklist for agent-go.\n\n1. Auto-compaction + PreCompact hook\n - pkg/agent/compaction.go: in-loop summarize-and-replace. Preserves\n leading system messages and the verbatim tail (default 6 messages),\n walks t\n[…]\n v4-flash:\n- Budget cap of $0.0001 trips on round 1 at $0.0023 with\n stop_reason=max_budget_usd\n- Prompted-refusal scenario surfaces stop_reason=refusal\n- Plain question surfaces stop_reason=end_turn",
"is_bot": false,
"headline": "feat(agent): auto-compaction, budget cap, stop_reason classification",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-05-16T00:28:10Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f8f61cba43026529162c96fdc78e2a49472a8374",
"body": "Surfaces v2.73's structured-output constraint on the command line:\n\n agentgo agent run \"Summarize ...\" \\\n --schema ./schemas/article_summary.json \\\n --schema-strict\n\nThe schema is loaded from disk, validated to parse as JSON at flag-parse\ntime, and threaded through WithStructuredOutput. T\n[…]\nlint catches\nprovider drift; Tier B response_format flows through for providers that\nsupport it. Schema name defaults to the filename when --schema-name is\nomitted (used by OpenAI structured outputs).",
"is_bot": false,
"headline": "feat(cli): agent run --schema for structured output",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-05-15T23:58:25Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2ee11e78f2f84fe27810a16e4ad3b7f5f72ad703",
"body": "Adds an optional structured-output constraint that an agent can be asked\nto honor on its final answer. Two-tier enforcement: native response_format\non every LLM call (fast path, OpenAI / structured-outputs-aware providers)\nplus a post-validation lint that re-prompts on schema mismatch (works on\never\n[…]\nafter the\n registry, sharing the lintRetryBudget for re-prompts.\n\nVerified end-to-end on DeepSeek v4-flash: both the type-derived and raw\nschema modes produce schema-compliant JSON on the first turn.",
"is_bot": false,
"headline": "feat(agent): structured output constraint via JSON Schema (Tier A + B)",
"author_name": "Liang Li",
"author_login": "liliang-cn",
"committed_at": "2026-05-15T01:22:13Z",
"body_truncated": true,
"is_coding_agent": false
}
],
"releases_count": 100,
"commits_last_year": 509,
"latest_release_at": "2026-07-30T06:22:15Z",
"latest_release_tag": "v2.107.0",
"releases_from_tags": false,
"days_since_last_push": 0,
"active_weeks_last_year": 35,
"days_since_latest_release": 0,
"mean_days_between_releases": 2.2
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": false,
"health_percentage": 42,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "github.com/liliang-cn/agent-go/v2",
"exists": true,
"license": null,
"keywords": [],
"ecosystem": "go",
"matches_repo": true,
"registry_url": "https://pkg.go.dev/github.com/liliang-cn/agent-go/v2",
"is_deprecated": false,
"latest_version": "v2.107.0",
"repository_url": "https://github.com/liliang-cn/agent-go",
"versions_count": 146,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": null,
"first_published_at": null,
"latest_published_at": "2026-07-30T06:20:16Z",
"latest_version_yanked": null,
"days_since_latest_publish": 0
}
]
},
"popularity": {
"forks": 0,
"stars": 6,
"watchers": 0,
"fork_history": {
"days": [],
"complete": true,
"collected": 0,
"total_forks": 0
},
"star_history": null,
"open_issues_and_prs": 0
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [
"examples"
],
"has_llms_txt": false,
"has_dockerfile": false,
"has_mcp_signal": true,
"bootstrap_files": [
"Makefile"
],
"api_schema_files": [
"pkg/ptc/grpc/proto/ptc.proto"
],
"has_devcontainer": false,
"typecheck_configs": [
"examples/superai/web/tsconfig.json",
"ui/tsconfig.json"
],
"toolchain_manifests": [
"go.mod"
],
"largest_source_bytes": 66631,
"source_files_sampled": 675,
"oversized_source_files": 2,
"agent_instruction_files": [
".github/copilot-instructions.md",
"AGENTS.md",
"CLAUDE.md",
"docs/dev/Agent.md",
"docs/dev/GEMINI.md"
],
"agent_instruction_max_bytes": 22474
},
"dependencies": {
"manifests": [
"go.mod",
"ui/package.json"
],
"advisories": {
"error": null,
"scope": null,
"source": null,
"findings": [],
"collected": false,
"malicious": [],
"truncated": false,
"by_severity": {},
"advisory_count": 0,
"affected_count": 0,
"assessed_count": 0,
"malicious_count": 0,
"assessed_package": null,
"unassessed_count": 0,
"direct_affected_count": 0
},
"ecosystems": [
"go",
"npm"
],
"dependencies": [
{
"name": "github.com/JohannesKaufmann/html-to-markdown/v2",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v2.5.0"
},
{
"name": "github.com/PuerkitoBio/goquery",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.10.3"
},
{
"name": "github.com/a2aproject/a2a-go",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.3.12"
},
{
"name": "github.com/blevesearch/bleve/v2",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v2.6.0"
},
{
"name": "github.com/charmbracelet/bubbletea",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.3.10"
},
{
"name": "github.com/charmbracelet/lipgloss",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.1.0"
},
{
"name": "github.com/chromedp/cdproto",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.0.0-20250724212937-08a3db8b4327"
},
{
"name": "github.com/chromedp/chromedp",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.14.1"
},
{
"name": "github.com/coder/acp-go-sdk",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.6.3"
},
{
"name": "github.com/creack/pty",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.1.21"
},
{
"name": "github.com/dop251/goja",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.0.0-20260226184354-913bd86fb70c"
},
{
"name": "github.com/dslipak/pdf",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.0.2"
},
{
"name": "github.com/go-shiori/go-readability",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.0.0-20251205110129-5db1dc9836f0"
},
{
"name": "github.com/google/uuid",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.6.0"
},
{
"name": "github.com/gorilla/websocket",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.5.3"
},
{
"name": "github.com/liliang-cn/cortexdb/v2",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v2.45.0"
},
{
"name": "github.com/liliang-cn/mcp-swagger-server",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.4.0"
},
{
"name": "github.com/liliang-cn/skills-go",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.7.0"
},
{
"name": "github.com/mark3labs/mcp-go",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.32.0"
},
{
"name": "github.com/mattn/go-runewidth",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.0.19"
},
{
"name": "github.com/modelcontextprotocol/go-sdk",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.6.1"
},
{
"name": "github.com/openai/openai-go/v3",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v3.39.0"
},
{
"name": "github.com/pkoukk/tiktoken-go",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.1.8"
},
{
"name": "github.com/qdrant/go-client",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.15.2"
},
{
"name": "github.com/robfig/cron/v3",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v3.0.1"
},
{
"name": "github.com/santhosh-tekuri/jsonschema/v5",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v5.3.1"
},
{
"name": "github.com/spf13/cobra",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.10.2"
},
{
"name": "github.com/spf13/viper",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.20.1"
},
{
"name": "github.com/stretchr/testify",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.11.1"
},
{
"name": "github.com/xuri/excelize/v2",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v2.11.0"
},
{
"name": "go.opentelemetry.io/otel",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.44.0"
},
{
"name": "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.44.0"
},
{
"name": "go.opentelemetry.io/otel/sdk",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.44.0"
},
{
"name": "go.opentelemetry.io/otel/trace",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.44.0"
},
{
"name": "golang.org/x/image",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.44.0"
},
{
"name": "golang.org/x/sync",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.22.0"
},
{
"name": "golang.org/x/term",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.44.0"
},
{
"name": "google.golang.org/grpc",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.81.1"
},
{
"name": "google.golang.org/protobuf",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.36.11"
},
{
"name": "gopkg.in/yaml.v3",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v3.0.1"
},
{
"name": "modernc.org/sqlite",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.38.2"
},
{
"name": "@ai-sdk/react",
"manifest": "ui/package.json",
"ecosystem": "npm",
"version_constraint": "^3.0.118"
},
{
"name": "@radix-ui/react-collapsible",
"manifest": "ui/package.json",
"ecosystem": "npm",
"version_constraint": "^1.1.12"
},
{
"name": "@radix-ui/react-label",
"manifest": "ui/package.json",
"ecosystem": "npm",
"version_constraint": "^2.1.8"
},
{
"name": "@radix-ui/react-scroll-area",
"manifest": "ui/package.json",
"ecosystem": "npm",
"version_constraint": "^1.2.10"
},
{
"name": "@radix-ui/react-select",
"manifest": "ui/package.json",
"ecosystem": "npm",
"version_constraint": "^2.2.6"
},
{
"name": "@radix-ui/react-separator",
"manifest": "ui/package.json",
"ecosystem": "npm",
"version_constraint": "^1.1.8"
},
{
"name": "@radix-ui/react-slot",
"manifest": "ui/package.json",
"ecosystem": "npm",
"version_constraint": "^1.2.4"
},
{
"name": "@radix-ui/react-tabs",
"manifest": "ui/package.json",
"ecosystem": "npm",
"version_constraint": "^1.1.13"
},
{
"name": "@radix-ui/react-tooltip",
"manifest": "ui/package.json",
"ecosystem": "npm",
"version_constraint": "^1.2.8"
},
{
"name": "@tanstack/react-query",
"manifest": "ui/package.json",
"ecosystem": "npm",
"version_constraint": "^5.62.0"
},
{
"name": "ai",
"manifest": "ui/package.json",
"ecosystem": "npm",
"version_constraint": "^6.0.116"
},
{
"name": "class-variance-authority",
"manifest": "ui/package.json",
"ecosystem": "npm",
"version_constraint": "^0.7.1"
},
{
"name": "clsx",
"manifest": "ui/package.json",
"ecosystem": "npm",
"version_constraint": "^2.1.1"
},
{
"name": "i18next",
"manifest": "ui/package.json",
"ecosystem": "npm",
"version_constraint": "^25.8.14"
},
{
"name": "i18next-browser-languagedetector",
"manifest": "ui/package.json",
"ecosystem": "npm",
"version_constraint": "^8.2.1"
},
{
"name": "lucide-react",
"manifest": "ui/package.json",
"ecosystem": "npm",
"version_constraint": "^1.17.0"
},
{
"name": "react",
"manifest": "ui/package.json",
"ecosystem": "npm",
"version_constraint": "^18.3.1"
},
{
"name": "react-dom",
"manifest": "ui/package.json",
"ecosystem": "npm",
"version_constraint": "^18.3.1"
},
{
"name": "react-i18next",
"manifest": "ui/package.json",
"ecosystem": "npm",
"version_constraint": "^16.5.5"
},
{
"name": "react-markdown",
"manifest": "ui/package.json",
"ecosystem": "npm",
"version_constraint": "^10.1.0"
},
{
"name": "react-router-dom",
"manifest": "ui/package.json",
"ecosystem": "npm",
"version_constraint": "^7.0.2"
},
{
"name": "remark-gfm",
"manifest": "ui/package.json",
"ecosystem": "npm",
"version_constraint": "^4.0.1"
},
{
"name": "tailwind-merge",
"manifest": "ui/package.json",
"ecosystem": "npm",
"version_constraint": "^3.6.0"
},
{
"name": "tailwindcss-animate",
"manifest": "ui/package.json",
"ecosystem": "npm",
"version_constraint": "^1.0.7"
}
],
"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": 1
},
"bus_factor": 1,
"bot_contributors": 1,
"top_contributors": [
{
"type": "User",
"login": "liliang-cn",
"commits": 517,
"avatar_url": "https://avatars.githubusercontent.com/u/20553741?v=4"
}
],
"contributors_sampled": 1,
"top_contributor_share": 1
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"ci.yml",
"release.yml"
],
"has_docs_dir": true,
"linter_configs": [],
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [
"go.sum",
"package-lock.json"
],
"scorecard": {
"checks": [
{
"name": "Binary-Artifacts",
"score": 10,
"reason": "no binaries found in the repo",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
},
{
"name": "Branch-Protection",
"score": 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": 3,
"reason": "project has 1 contributing companies or organizations -- score normalized to 3",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": 10,
"reason": "no dangerous workflow patterns detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 0,
"reason": "no update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 0,
"reason": "project is not fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 10,
"reason": "license file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 10,
"reason": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
},
{
"name": "Packaging",
"score": null,
"reason": "packaging workflow not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
},
{
"name": "Pinned-Dependencies",
"score": 0,
"reason": "dependency not pinned by hash detected -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 0,
"reason": "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": 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": 0,
"reason": "43 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "dfef25699fadb1946dfca9e74e5317e3dbfd38fa",
"ran_at": "2026-07-30T20:07:04Z",
"aggregate_score": 2.9,
"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-30T06:22:20Z",
"oldest_open_prs": [],
"last_merged_pr_at": null,
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": []
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/liliang-cn/agent-go",
"host": "github.com",
"name": "agent-go",
"owner": "liliang-cn"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 54,
"inputs": {
"security": 29,
"vitality": 89,
"community": 29,
"governance": 39,
"engineering": 76
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "excellent",
"name": "Vitality",
"value": 89,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "excellent",
"name": "Development activity",
"note": null,
"notes": [],
"value": 88,
"inputs": {
"commits_last_year": 509,
"human_commit_share": 1,
"days_since_last_push": 0,
"active_weeks_last_year": 35
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 0 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 0
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "35/52 weeks with commits",
"points": 24.2,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 35
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "509 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 509
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "30 commit(s) and 0 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": 100,
"latest_release_tag": "v2.107.0",
"releases_from_tags": false,
"days_since_latest_release": 0,
"mean_days_between_releases": 2.2
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "100 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 100
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 0 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 0
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~2.2 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 2.2
}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "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": "maintained",
"guards": [],
"signals": [],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": null,
"unanswered_open_prs": null,
"unanswered_open_issues": null,
"days_since_last_merged_pr": null,
"days_since_last_human_commit": 0,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "last human commit 0 days ago",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_maintained",
"params": {
"days": 0
}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "critical",
"name": "Community & Adoption",
"value": 29,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "critical",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 11,
"inputs": {
"forks": 0,
"stars": 6,
"watchers": 0,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "6 stars",
"points": 11.3,
"status": "partial",
"details": [
{
"code": "stars",
"params": {
"count": 6
}
}
],
"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": 50,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": false,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "recognized license (MIT)",
"points": 22.5,
"status": "met",
"details": [
{
"code": "license_standard",
"params": {}
},
{
"code": "license_spdx",
"params": {
"spdx": "MIT"
}
}
],
"max_points": 22.5
},
{
"key": "contributing_guide",
"name": "CONTRIBUTING guide",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 13.5
},
{
"key": "issue_template",
"name": "Issue template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.2
},
{
"key": "pr_template",
"name": "PR template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.3
}
]
}
],
"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": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 13,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 1,
"top_contributor_share": 1
},
"components": [
{
"key": "bus_factor",
"name": "Bus factor",
"detail": "1 contributor(s) cover half of all commits",
"points": 9,
"status": "partial",
"details": [
{
"code": "bus_factor",
"params": {
"count": 1
}
}
],
"max_points": 54
},
{
"key": "commit_distribution",
"name": "Commit distribution",
"detail": "top contributor authored 100% of commits",
"points": 0,
"status": "missed",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 100
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "1 contributors",
"points": 1.4,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 1
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 3,
"status": "partial",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "critical",
"name": "Issue & PR responsiveness",
"note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"issue_resolution"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 1,
"inputs": {
"merged_prs": 0,
"open_issues": 0,
"closed_issues": 0,
"issue_closed_ratio": null,
"closed_unmerged_prs": 1
},
"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": "0/1 decided PRs merged",
"points": 0,
"status": "missed",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 0,
"decided": 1
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "moderate",
"name": "Ownership & stewardship",
"note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"verified_domain"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 61,
"inputs": {
"followers": 101,
"owner_type": "User",
"is_verified": null,
"owner_login": "liliang-cn",
"public_repos": 45,
"account_age_days": 3662
},
"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": "101 followers of liliang-cn",
"points": 14.4,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 101,
"login": "liliang-cn"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "45 public repos, account ~10 yr old",
"points": 24.1,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 45
}
},
{
"code": "account_age_years",
"params": {
"years": 10
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"github.com/liliang-cn/agent-go/v2"
],
"ecosystems": "go",
"any_deprecated": false,
"min_days_since_publish": 0
},
"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 0 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 0
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "146 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 146
}
}
],
"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": 76,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "moderate",
"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": 60,
"inputs": {
"has_ci": true,
"has_tests": true,
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": "2 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 2
}
}
],
"max_points": 24
},
{
"key": "tests_present",
"name": "Tests present",
"detail": null,
"points": 24,
"status": "met",
"details": [],
"max_points": 24
},
{
"key": "linter_config",
"name": "Linter config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 16
},
{
"key": "pre_commit_hooks",
"name": "Pre-commit hooks",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 9.6
},
{
"key": "editorconfig",
"name": ".editorconfig",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.4
},
{
"key": "openssf_scorecard_ci_tests",
"name": "OpenSSF Scorecard: CI-Tests",
"detail": "no pull request found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "excellent",
"name": "Documentation",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"topics": [
"llm",
"ollama",
"rag",
"local-llm",
"rag-local",
"semantic-search"
],
"has_wiki": true,
"homepage": "https://liliang-cn.github.io/agent-go/",
"has_readme": true,
"has_docs_dir": true,
"has_description": true
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 30,
"status": "met",
"details": [],
"max_points": 30
},
{
"key": "documentation_directory",
"name": "Documentation directory",
"detail": null,
"points": 25,
"status": "met",
"details": [],
"max_points": 25
},
{
"key": "documentation_homepage_site",
"name": "Documentation / homepage site",
"detail": "https://liliang-cn.github.io/agent-go/",
"points": 15,
"status": "met",
"details": [],
"max_points": 15
},
{
"key": "repository_description",
"name": "Repository description",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "topics",
"name": "Topics",
"detail": "6 topics",
"points": 10,
"status": "met",
"details": [
{
"code": "topics_count",
"params": {
"count": 6
}
}
],
"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": 29,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "critical",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): CI-Tests, Packaging. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"ci_tests",
"packaging"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 29,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 16,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 2,
"scorecard_aggregate": 2.9
},
"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 1 contributing companies or organizations -- score normalized to 3",
"points": 0.8,
"status": "partial",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no dangerous workflow patterns detected",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "no update tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is not fuzzed",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file detected",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "packaging",
"name": "Packaging",
"detail": "packaging workflow not detected",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 5
},
{
"key": "pinned_dependencies",
"name": "Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "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": "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": "43 existing vulnerabilities detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
}
]
},
{
"key": "high_risk_jurisdiction_exposure",
"band": "excellent",
"name": "High-Risk Jurisdiction Exposure",
"note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
"notes": [
{
"code": "jurisdiction_evidence_limits",
"params": {}
}
],
"value": 100,
"inputs": {
"meaning": "self-published location evidence; not nationality or citizenship",
"red_flag": false,
"exposures": [],
"policy_countries": [
"Russia",
"Iran",
"North Korea"
],
"review_only_matches": 0,
"assessed_self_published_locations": 2
},
"components": [
{
"key": "policy_exposure_multiplier",
"name": "Policy exposure multiplier",
"detail": "no confirmed policy-scope location match",
"points": 100,
"status": "met",
"details": [
{
"code": "jurisdiction_no_match",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
},
{
"key": "ai_readiness",
"band": "good",
"name": "AI Readiness",
"value": 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": 0.99,
"agent_instruction_files": [
".github/copilot-instructions.md",
"AGENTS.md",
"CLAUDE.md",
"docs/dev/Agent.md",
"docs/dev/GEMINI.md"
],
"agent_instruction_max_bytes": 22474
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": ".github/copilot-instructions.md, AGENTS.md, CLAUDE.md, docs/dev/Agent.md, docs/dev/GEMINI.md",
"points": 45,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": ".github/copilot-instructions.md, AGENTS.md, CLAUDE.md, docs/dev/Agent.md, docs/dev/GEMINI.md"
}
}
],
"max_points": 45
},
{
"key": "machine_readable_docs_llms_txt",
"name": "Machine-readable docs (llms.txt)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "legible_commit_history",
"name": "Legible commit history",
"detail": "99 of 100 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 99,
"sampled": 100
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "moderate",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 61,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [
"go.sum",
"package-lock.json"
],
"has_dockerfile": false,
"typed_language": true,
"bootstrap_files": [
"Makefile"
],
"has_devcontainer": false,
"has_linter_config": false,
"typecheck_configs": [
"examples/superai/web/tsconfig.json",
"ui/tsconfig.json"
],
"agent_commit_share": 0,
"toolchain_manifests": [
"go.mod"
],
"dependency_bot_commit_share": 0
},
"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": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 11
},
{
"key": "static_type_checking",
"name": "Static type checking",
"detail": "examples/superai/web/tsconfig.json, ui/tsconfig.json",
"points": 11,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "examples/superai/web/tsconfig.json, ui/tsconfig.json"
}
}
],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": "lockfile",
"points": 10,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "lockfile"
}
}
],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "no agent-authored commits among the last 100",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_authored_commits",
"params": {
"sampled": 100
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "no automated dependency updates observed",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_dependency_automation",
"params": {}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "excellent",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"primary_language": "Go",
"largest_source_bytes": 66631,
"source_files_sampled": 675,
"oversized_source_files": 2
},
"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": "2/675 source files over 60KB",
"points": 54.8,
"status": "partial",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 675,
"oversized": 2
}
}
],
"max_points": 55
}
]
},
{
"key": "ai_interfaces",
"band": "excellent",
"name": "Machine-readable interfaces",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"example_dirs": [
"examples"
],
"has_mcp_signal": true,
"api_schema_files": [
"pkg/ptc/grpc/proto/ptc.proto"
]
},
"components": [
{
"key": "api_schema_openapi_graphql_proto",
"name": "API schema (OpenAPI/GraphQL/proto)",
"detail": "pkg/ptc/grpc/proto/ptc.proto",
"points": 40,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "pkg/ptc/grpc/proto/ptc.proto"
}
}
],
"max_points": 40
},
{
"key": "mcp_server",
"name": "MCP server",
"detail": null,
"points": 20,
"status": "met",
"details": [],
"max_points": 20
},
{
"key": "runnable_examples",
"name": "Runnable examples",
"detail": "examples",
"points": 40,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "examples"
}
}
],
"max_points": 40
}
]
}
],
"description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
}
],
"metrics_version": "1.13.0"
},
"warnings": [
"Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
"GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
],
"report_type": "repository",
"generated_at": "2026-07-30T20:07:09.506799Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/l/liliang-cn/agent-go.svg",
"full_name": "liliang-cn/agent-go",
"license_state": "standard",
"license_spdx": "MIT"
}