feat(vesseld): daemon binary v0.1.0#62
Merged
Merged
Conversation
lIang70
added a commit
that referenced
this pull request
May 7, 2026
Two flakes caught by Go 1.26 -race CI on PR #62: - cmd/vesseld/api: TestAPI_Metrics_TextExposition raced the run registry's terminal-state goroutine. /call returns when the Handle's Wait resolves, but CompletedAt is set by a separate goroutine watching h.Done(). Poll /metrics for the completed counter rather than asserting on a single shot. - vessel: TestProbe_RestartOnFailure tried to catch the transient PhaseFailed window with 5ms polling, which the race-detector scheduler can skip past. Switch to checking the persistent c.restartAttempts counter (resets only after stableWindow=30s) combined with PhaseRunning — the restart counter is the durable artefact of the failure→recovery cycle. Co-authored-by: Cursor <cursoragent@cursor.com>
3 tasks
The vesseld control plane: declarative YAML config (apispec v1alpha1), engine/probe/tool/LLM-provider catalog, multi-vessel fleet, HTTP API over Unix socket + optional TCP+bearer-token, SSE log stream, Prometheus /metrics, paged /v1/runs, and a mock-OpenAI-friendly graph-llm engine that emits full engine.run.> lifecycle envelopes. Module pins: - sdk v0.2.7 - sdkx v0.2.5 - vessel v0.1.0-rc.1 (PR #61) Conventions follow the rest of the repo: no replace directives, go.sum committed, GOWORK=off-friendly. CI gains a test-vesseld job and the auto-tag workflow now patch-bumps cmd/vesseld once a seed tag exists. The e2e black-box suite + the multi-vessel example land in follow-up PRs. [skip-tag:sdk] Co-authored-by: Cursor <cursoragent@cursor.com>
Two flakes caught by Go 1.26 -race CI on PR #62: - cmd/vesseld/api: TestAPI_Metrics_TextExposition raced the run registry's terminal-state goroutine. /call returns when the Handle's Wait resolves, but CompletedAt is set by a separate goroutine watching h.Done(). Poll /metrics for the completed counter rather than asserting on a single shot. - vessel: TestProbe_RestartOnFailure tried to catch the transient PhaseFailed window with 5ms polling, which the race-detector scheduler can skip past. Switch to checking the persistent c.restartAttempts counter (resets only after stableWindow=30s) combined with PhaseRunning — the restart counter is the durable artefact of the failure→recovery cycle. Co-authored-by: Cursor <cursoragent@cursor.com>
Bumps vessel to v0.1.0-rc.2 and migrates Fleet's two <-h.Done()
watcher goroutines to the new synchronous OnTerminate hook
(vessel#63):
- runRegistry.track: removes its private goroutine; the
OnTerminate hook updates CompletedAt / Status / Messages /
Err inside the captain's dispatch goroutine, BEFORE Done is
closed. Fixes the /call→/metrics race that PR-2's first CI
pass papered over with poll-until-ready.
- Fleet.Submit: gate-release watcher likewise replaced with
an OnTerminate hook. One fewer goroutine per Submit.
- noopCtx helper deleted — the registry no longer calls
Handle.Wait, so it doesn't need a synthetic never-cancelling
context.
Reverts the test-side polling hack in TestAPI_Metrics_TextExposition
because the OnTerminate ordering contract now guarantees the
counter is populated by the time /call returns.
Co-authored-by: Cursor <cursoragent@cursor.com>
lIang70
force-pushed
the
feat/vesseld-v0.1.0
branch
from
May 7, 2026 07:43
3d02886 to
7f06811
Compare
Co-authored-by: Cursor <cursoragent@cursor.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Second slice of vessel v0.1.0 — the vesseld control plane that hosts vessels in a long-running daemon. Module is
cmd/vesseld/(own go.mod, ~58 files, ~7.8k LOC).Pinned dependencies (no
replacedirectives):sdkv0.2.7sdkxv0.2.5vesselv0.1.0-rc.1(PR #61)Scope
apispec/v1alpha1— YAML schema forDaemon/LLMProfile/HistoryStore/Vessel/Agentloader/resolver/catalog/fleet/api/cli/runtimegraph-llmengine emits fullengine.run.>lifecycle envelopes/healthz,/readyz,/metrics(Prometheus),/v1/{plan,vessels,runs}, SSE log streamauth.tokenvia TCP, Unix-socket file-mode authListRuns,Snapshot()for metrics, daemon-wide concurrency gate, per-LLMProfile rate limitersRelease strategy
cmd/vesseldis a daemon binary, not a library — it does NOT participate in the Go-module auto-tag flow. Releases ship as GitHub Release artifacts via.github/workflows/release-vesseld.yml, triggered onvesseld/v*tag push:vesseld/*tagv0.1.0-rc.1) auto-marked--prereleaseCI
test-vesseldmatrix job (Go 1.25 + 1.26,-race)lint/ post-merge build extended to vesseldauto-tag.ymlintentionally excludes cmd/vesseldTest plan
go vet ./...incmd/vesseld/go test -race -count=1 ./...incmd/vesseld/GOWORK=off go build ./...incmd/vesseld/gofmt -l cmd/vesseldemptyOut of scope
test(vesseld): e2e black-box suite— chained on this PRchore: examples + MakefileNotes
[skip-tag:sdk]because no sdk files touched.git tag vesseld/v0.1.0-rc.1 && git push origin vesseld/v0.1.0-rc.1triggers the release workflow.