You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
internal/hermes has zero tests despite being the only Python bridge — test the JSON-RPC protocol (request/response round-trip, error envelope, notifications) with a fake stdin/stdout pipe
internal/iam (security analysis), internal/cloudflare, internal/sre, internal/digitalocean, internal/gcp, internal/hetzner, internal/openclaw all have zero tests
internal/maker has 7 tests for 46 source files — prioritise handleAWSFailure + classifyAWSFailure with golden AWS error strings
MCP / schema consistency
Mixed WithInputSchema[T]() (reflection-based) vs WithString/WithBoolean (explicit) across mcp_*.go files. The comment in mcp_linear.go:17-18 says reflection is broken — but mcp_sentry.go:62, mcp_notion.go:23 still use the broken path. Pin a known-good mcp-go version + add an integration test that tools/list schemas are correctly populated
Maker
Maker ExecutePlan is fully serial (internal/maker/exec.go:406) — add opt-in concurrency via DependsOn graph + topological levels + errgroup. Default stays serial; gate behind ExecOptions.MaxParallel. Big win for 25+ step plans
Hermes
isHermesDir only checks .venv/bin/python exists (internal/hermes/runner.go:76-79) — partial install lands here and bridge dies on first import pydantic_ai. Also check pyproject.toml / bridge.py / .venv/.installed marker; suggest make setup-hermes on bridge exit with ModuleNotFoundError
Convention
cmd/notion.go:85-94 derives history key from workspaceName which is only known after the first API call — if GatherAccountStatus fails, history splits across "default" and the real workspace name. Key on Notion bot user ID instead (cached in ~/.clanker/notion-workspace-map.json)
cmd/config.go:52 TODO — service_keywords removed from default config but routing still expects them. Decide: keep with sensible defaults, or remove the consumer in internal/agent/semantic. Close the TODO
Quality
resolveAIKeyForProfile + containsAny duplicated across cmd/sentry.go:311-341, cmd/notion.go, cmd/linear.go, cmd/cf.go. Move to internal/ai.ResolveKeyForProfile and internal/util.ContainsAny
Data race in deploy.intelligence parallel phase-1 (internal/deploy/intelligence.go:295-366) — three goroutines write to deep, deepErr, infraSnap etc. without locking. Convert to errgroup.WithContext with locals captured by closure
Acceptance criteria
Each checkbox = small PR. Close when all are checked.
Tracker — CLI quality polish
Collected P2 findings from the clanker CLI audit.
Test coverage gaps
internal/hermeshas zero tests despite being the only Python bridge — test the JSON-RPC protocol (request/response round-trip, error envelope, notifications) with a fake stdin/stdout pipeinternal/iam(security analysis),internal/cloudflare,internal/sre,internal/digitalocean,internal/gcp,internal/hetzner,internal/openclawall have zero testsinternal/makerhas 7 tests for 46 source files — prioritisehandleAWSFailure+classifyAWSFailurewith golden AWS error stringsMCP / schema consistency
WithInputSchema[T]()(reflection-based) vsWithString/WithBoolean(explicit) across mcp_*.go files. The comment in mcp_linear.go:17-18 says reflection is broken — but mcp_sentry.go:62, mcp_notion.go:23 still use the broken path. Pin a known-good mcp-go version + add an integration test thattools/listschemas are correctly populatedMaker
ExecutePlanis fully serial (internal/maker/exec.go:406) — add opt-in concurrency via DependsOn graph + topological levels +errgroup. Default stays serial; gate behindExecOptions.MaxParallel. Big win for 25+ step plansHermes
isHermesDironly checks.venv/bin/pythonexists (internal/hermes/runner.go:76-79) — partial install lands here and bridge dies on firstimport pydantic_ai. Also checkpyproject.toml/bridge.py/.venv/.installedmarker; suggestmake setup-hermeson bridge exit withModuleNotFoundErrorConvention
cmd/notion.go:85-94derives history key fromworkspaceNamewhich is only known after the first API call — ifGatherAccountStatusfails, history splits across "default" and the real workspace name. Key on Notion bot user ID instead (cached in~/.clanker/notion-workspace-map.json)cmd/config.go:52TODO —service_keywordsremoved from default config but routing still expects them. Decide: keep with sensible defaults, or remove the consumer ininternal/agent/semantic. Close the TODOQuality
resolveAIKeyForProfile+containsAnyduplicated across cmd/sentry.go:311-341, cmd/notion.go, cmd/linear.go, cmd/cf.go. Move tointernal/ai.ResolveKeyForProfileandinternal/util.ContainsAnydeploy.intelligenceparallel phase-1 (internal/deploy/intelligence.go:295-366) — three goroutines write todeep,deepErr,infraSnapetc. without locking. Convert toerrgroup.WithContextwith locals captured by closureAcceptance criteria
Each checkbox = small PR. Close when all are checked.