Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Guide for building reliable, fault-tolerant Go applications with DBOS durable workflows. Use when adding DBOS to existing Go code, creating workflows and steps, or using queues for concurrency control.
.claude/skills/dbos-golang/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | -10% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 38% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 17% | 0% |
| case-09 | ✗→✓ | ▲ Improved | -5% | 0% |
| case-10 | ✗→✓ | ▲ Improved | -23% | 0% |
Guide for building reliable, fault-tolerant Go applications with DBOS durable workflows.
Reference these guidelines when:
| Priority | Category | Impact | Prefix | |----------|----------|--------|--------| | 1 | Lifecycle | CRITICAL | lifecycle- | | 2 | Workflow | CRITICAL | workflow- | | 3 | Step | HIGH | step- | | 4 | Queue | HIGH | queue- | | 5 | Communication | MEDIUM | comm- | | 6 | Pattern | MEDIUM | pattern- | | 7 | Testing | LOW-MEDIUM | test- | | 8 | Client | MEDIUM | client- | | 9 | Advanced | LOW | advanced- |
Install the DBOS Go module:
bashgo get github.com/dbos-inc/dbos-transact-golang/dbos@latest
A DBOS application MUST create a context, register workflows, and launch before running any workflows:
gopackage main import ( "context" "log" "os" "time" "github.com/dbos-inc/dbos-transact-golang/dbos" ) func main() { ctx, err := dbos.NewDBOSContext(context.Background(), dbos.Config{ AppName: "my-app", DatabaseURL: os.Getenv("DBOS_SYSTEM_DATABASE_URL"), }) if err != nil { log.Fatal(err) } defer dbos.Shutdown(ctx, 30*time.Second) dbos.RegisterWorkflow(ctx, myWorkflow) if err := dbos.Launch(ctx); err != nil { log.Fatal(err) } }
Workflows are comprised of steps. Any function performing complex operations or accessing external services must be run as a step using dbos.RunAsStep:
gofunc fetchData(ctx context.Context) (string, error) { resp, err := http.Get("https://api.example.com/data") if err != nil { return "", err } defer resp.Body.Close() body, _ := io.ReadAll(resp.Body) return string(body), nil } func myWorkflow(ctx dbos.DBOSContext, input string) (string, error) { result, err := dbos.RunAsStep(ctx, fetchData, dbos.WithStepName("fetchData")) if err != nil { return "", err } return result, nil }
dbos.RunWorkflow with queues or dbos.Go/dbos.Select for concurrent stepsLaunch()Read individual rule files for detailed explanations and examples:
references/lifecycle-config.md
references/workflow-determinism.md
references/queue-concurrency.md| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 21,347 | 14,155 | -34% | 1 | 1 | 0% | 4,652 | 4,187 | -10% | 0 | 0 | — |
case-02 | fail→pass | 16,341 | 16,066 | -2% | 1 | 1 | 0% | 3,250 | 4,471 | +38% | 0 | 0 | — |
case-03 | fail→pass | 15,309 | 13,112 | -14% | 1 | 1 | 0% | 3,113 | 3,652 | +17% | 0 | 0 | — |
case-04 | fail→fail | 13,920 | 9,981 | -28% | 1 | 1 | 0% | 2,802 | 2,958 | +6% | 0 | 0 | — |
case-05 | fail→fail | 14,357 | 12,284 | -14% | 1 | 1 | 0% | 3,057 | 3,468 | +13% | 0 | 0 | — |
case-06 | fail→fail | 12,035 | 7,261 | -40% | 1 | 1 | 0% | 2,245 | 2,357 | +5% | 0 | 0 | — |
case-07 | pass→pass | 11,558 | 6,992 | -40% | 1 | 1 | 0% | 2,117 | 2,324 | +10% | 0 | 0 | — |
case-08 | fail→fail | 6,385 | 4,437 | -31% | 1 | 1 | 0% | 1,231 | 1,749 | +42% | 0 | 0 | — |
case-09 | fail→pass | 11,944 | 5,417 | -55% | 1 | 1 | 0% | 1,997 | 1,901 | -5% | 0 | 0 | — |
case-10 | fail→pass | 15,310 | 5,244 | -66% | 1 | 1 | 0% | 2,569 | 1,985 | -23% | 0 | 0 | — |
case-11 | fail→pass | 2,628 | 2,326 | -11% | 1 | 1 | 0% | 502 | 1,356 | +170% | 0 | 0 | — |
case-12 | fail→pass | 4,513 | 3,279 | -27% | 1 | 1 | 0% | 800 | 1,526 | +91% | 0 | 0 | — |
case-13 | fail→fail | 7,621 | 4,952 | -35% | 1 | 1 | 0% | 1,462 | 1,909 | +31% | 0 | 0 | — |
case-14 | pass→pass | 12,586 | 6,139 | -51% | 1 | 1 | 0% | 2,143 | 2,046 | -5% | 0 | 0 | — |
case-15 | pass→pass | 7,363 | 2,718 | -63% | 1 | 1 | 0% | 1,461 | 1,463 | +0% | 0 | 0 | — |
case-16 | fail→fail | 15,447 | 10,189 | -34% | 1 | 1 | 0% | 2,996 | 2,961 | -1% | 0 | 0 | — |
case-17 | fail→fail | 15,686 | 12,779 | -19% | 1 | 1 | 0% | 2,615 | 3,677 | +41% | 0 | 0 | — |
case-18 | fail→fail | 7,354 | 3,861 | -47% | 1 | 1 | 0% | 1,252 | 1,668 | +33% | 0 | 0 | — |
case-19 | fail→pass | 3,716 | 1,997 | -46% | 1 | 1 | 0% | 610 | 1,209 | +98% | 0 | 0 | — |
case-20 | fail→fail | 10,708 | 8,312 | -22% | 1 | 1 | 0% | 1,994 | 2,532 | +27% | 0 | 0 | — |
case-21 | fail→pass | 10,126 | 6,051 | -40% | 1 | 1 | 0% | 1,902 | 2,179 | +15% | 0 | 0 | — |
case-22 | fail→fail | 8,788 | 6,718 | -24% | 1 | 1 | 0% | 1,556 | 2,235 | +44% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +41 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.