B5: skill CLI (new/test/bench/audit/suggest) - #124
Conversation
… audit, suggest (heuristic)
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
|
Claude finished @thrillmot's task in 4m 26s —— View job B5 skill CLI review
🐛 Clud Bug reviewThis round: 2 critical · 1 minor · 0 resolved from prior · 0 still open Found: 2 🔴 / 1 🟡 / 0 🟣 Per-skill scan
Critical findings🔴 [critical-issues-only]: ReasoningA misbehaving or attacker-controlled proxy can stream an arbitrarily large body; the 30-second timeout only gates on time, not bytes. With 🔴 [critical-issues-only]: ReasoningA skill named Minor findings🟡 [critical-issues-only]: Skills referenced: [critical-issues-only, evidence-based-review, respect-existing-conventions] |
🐛 Clud Bug reviewThis round: 2 critical · 1 minor · 0 resolved from prior · 0 still open Found: 2 🔴 / 1 🟡 / 0 🟣 Per-skill scan
Critical findings🔴 [critical-issues-only]: io.ReadAll with no size limit on Anthropic HTTP response body risks OOM (internal/skill/suggest_llm.go:248). ReasoningA misbehaving or proxy-injected endpoint can stream an arbitrarily large body; the 30-second timeout gates time, not bytes. Legitimate max_tokens=2000 response is ~10 KB — a 1 MB LimitReader is sufficient: io.LimitReader(resp.Body, 1<<20). io is already imported. 🔴 [critical-issues-only]: strings.Count uses substring matching for DecisionCount, permanently masking ghost skills with common short names (internal/skill/audit.go:85). ReasoningA skill named 'go' matches 'going', 'postgres', 'logo' etc., producing counts of hundreds. Classify uses DecisionCount == 0 as the sole ghost gate (line 152), so any skill whose name is a common substring is immune from ghost detection. Fix: wrap name in word-boundary regex via regexp.QuoteMeta. Minor findings🟡 [critical-issues-only]: extractJSONBlob uses last-} heuristic — trailing } in LLM preamble silently degrades to heuristic fallback (internal/skill/suggest_llm.go:342). Reasoningstrings.LastIndex(text, "}") grabs the last } in the entire response. If the model emits any commentary containing } after the JSON object, the extracted slice is invalid JSON, json.Unmarshal fails, and the command falls back to heuristic without telling the user the LLM parse failed. The system prompt says 'no commentary' so this is rare but not impossible. Skills referenced: [critical-issues-only, evidence-based-review, respect-existing-conventions] |
…der, JSON brace-balance, audit comment)
|
Claude finished @thrillmot's task in 2m 45s —— View job B5 skill CLI — fix-push re-review
This round: 0 critical · 0 minor · 2 resolved from prior · 1 still open Found: 0 🔴 / 0 🟡 / 0 🟣 Prior findings statusResolved ✅ — Resolved ✅ — Still open Per-skill scan
Skills referenced: [critical-issues-only, evidence-based-review, respect-existing-conventions] |
🐛 Clud Bug reviewThis round: 0 critical · 0 minor · 2 resolved from prior · 1 still open Found: 0 🔴 / 0 🟡 / 0 🟣 Per-skill scan
Skills referenced: [critical-issues-only, evidence-based-review, respect-existing-conventions] |
…ord matching (clud-bug PR #124)
|
Claude finished @thrillmot's task in 2m 46s —— View job B5 skill CLI — fix-push re-review (round 3)
🐛 Clud Bug reviewThis round: 0 critical · 0 minor · 1 resolved from prior · 0 still open Found: 0 🔴 / 0 🟡 / 0 🟣 Per-skill scan
Prior findings statusResolved ✅ — Skills referenced: [critical-issues-only, evidence-based-review, respect-existing-conventions] |
🐛 Clud Bug reviewThis round: 0 critical · 0 minor · 1 resolved from prior · 0 still open Found: 0 🔴 / 0 🟡 / 0 🟣 Per-skill scan
Skills referenced: [critical-issues-only, evidence-based-review, respect-existing-conventions] |
Workflow-template audit tests substitute `__version__` into expected pip-install pin; main is at 0.6.16, this branch was at 0.6.14, all 3 audit-test assertions fail pre-existingly on every Go PR opened against v1-go-rewrite (B5 #124, B6 #125, future waves). 20/20 tests in `tests/test_v0_2_1_audit_fixes.py` pass locally with the bump. Once merged, re-running CI on B5 #124 + B6 #125 unblocks both for auto-merge. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: thrillmot <thrillmot@users.noreply.github.com>
# Conflicts: # docs/file-structure.md # docs/timeline.md
|
Claude finished @thrillmot's task in 1m 17s —— View job B5 skill CLI — fix-push re-review (round 4)
This round: 0 critical · 0 minor · 0 resolved from prior · 0 still open Found: 0 🔴 / 0 🟡 / 0 🟣 Per-skill scan
Delta summaryThe two new commits cherry-pick the All prior B5 findings (LimitReader, brace-balance extractor, DecisionCount whole-word matching) remain resolved. Skills referenced: [critical-issues-only, evidence-based-review, respect-existing-conventions] |
🐛 Clud Bug reviewThis round: 0 critical · 0 minor · 0 resolved from prior · 0 still open Found: 0 🔴 / 0 🟡 / 0 🟣 Per-skill scan
Skills referenced: [critical-issues-only, evidence-based-review, respect-existing-conventions] |
Summary
Wave B5 of the SkDD v1.0 cutover: ports
logmind skill new/test/bench/audit/suggestfrom Python (src/logmind/core/skill_cli.pyat v0.6.16) to Go.skill suggestvia Anthropic Messages API (net/http— no external SDK).--no-llmflag forces heuristic mode; engine config in.logmind/config.yml skill_suggest.*(defaults:engine: llm,claude-haiku-4-5,2000 max_tokens). Graceful fallback to heuristic whenANTHROPIC_API_KEY(or configured env var) is missing ANDfallback_to_heuristic_on_no_key: true.--no-provenance.skill new <name>stdout text + generated SKILL.md bodyskill test <name>pass/fail check lines + ok-trailerskill bench <name>table +--jsonoutputskill audittable +--json(status field, last-touched date)skill suggest --no-llmhuman-readable +--json--sinceTest plan
go test ./internal/skill/ ./internal/cli/— 30+ unit + snapshot tests, all greengo vet ./...— cleanvenv/bin/logmindfornew,test,bench,audit,suggest— byte-identical (modulo/private/var/folderssymlink prefix on macOS)httptest.NewServerround-trip testrunSkillSuggesttestCoordination with B6
internal/config/is owned by the parallel B6 wave. B5 adds a tiny local YAML helper (internal/cli/skill_config.go) to read only theskill_suggest:block; when B6 lands a richerConfigstruct, drop the helper and callconfig.Load(cwd).SkillSuggestdirectly.🤖 Generated with Claude Code