Recorded examples

Recorded workflows

These bounded examples show what ran and what came out. The delivery status records the broader product assessment.

The workflow notebook

Examples of workflow source and observed results

Informational examples

Small fixtures, real model turns, explicit checks. These examples explain what ran and what came out; they do not gate releases or deployment.

01

Semantic index

Four reader questions become a faithful map to the supplied sources.

Passed · bounded fixture

In / actual Go source

func SemanticIndex(ctx context.Context, env gimbal.Env, corpus string) (Index, error) {
	gimbal.Set(ctx, "corpus", corpus)
	author := gimbal.NewSession(ctx, gimbal.RoleBulkClassification, env.WorkDir)
	index, err := author.Generate[Index](ctx, indexPrompt)
	if err != nil {
		return Index{}, err
	}
	if err := ValidateIndex(index); err != nil {
		return Index{}, err
	}
	gimbal.SetJSON(ctx, "candidate", index)
	reviewer := gimbal.NewSession(ctx, gimbal.RoleCodeReview, env.WorkDir)
	review, err := reviewer.Generate[Review](ctx, indexReview)
	if err != nil {
		return Index{}, err
	}
	gimbal.SetJSON(ctx, "review", review)
	if len(review.Findings) != 0 {
		return Index{}, fmt.Errorf("index review: %v", review.Findings)
	}
	return index, nil
}
Full source, types & prompts
// Package notebook contains two bounded, informational workflow examples.
// They are learning/evaluation material, independent of release or deployment gates.
package notebook

import (
	"context"
	"fmt"
	"github.com/tylergannon/gimbal"
)

//go:generate go tool polytype --validate

// Route connects a reader's question to evidence in the supplied corpus.
type Route struct {
	Question string   `json:"question"`
	Sources  []string `json:"sources"`
	Answer   string   `json:"answer"`
}

// Index is a compact question-driven map, not a vector database.
type Index struct {
	Routes []Route `json:"routes"`
}

// Task is a bounded delivery outcome with dependencies and acceptance evidence.
type Task struct {
	ID         string   `json:"id"`
	Outcome    string   `json:"outcome"`
	DependsOn  []string `json:"depends_on"`
	Acceptance string   `json:"acceptance"`
}

// Sprint is an ordered plan for the supplied goal and constraints.
type Sprint struct {
	Goal  string `json:"goal"`
	Tasks []Task `json:"tasks"`
}

// Review is an independent assessment against the original fixture.
type Review struct {
	Findings []string `json:"findings"`
}

// SemanticIndex creates a retrieval map and gives it to a fresh reviewer.
func SemanticIndex(ctx context.Context, env gimbal.Env, corpus string) (Index, error) {
	gimbal.Set(ctx, "corpus", corpus)
	author := gimbal.NewSession(ctx, gimbal.RoleBulkClassification, env.WorkDir)
	index, err := author.Generate[Index](ctx, indexPrompt)
	if err != nil {
		return Index{}, err
	}
	if err := ValidateIndex(index); err != nil {
		return Index{}, err
	}
	gimbal.SetJSON(ctx, "candidate", index)
	reviewer := gimbal.NewSession(ctx, gimbal.RoleCodeReview, env.WorkDir)
	review, err := reviewer.Generate[Review](ctx, indexReview)
	if err != nil {
		return Index{}, err
	}
	gimbal.SetJSON(ctx, "review", review)
	if len(review.Findings) != 0 {
		return Index{}, fmt.Errorf("index review: %v", review.Findings)
	}
	return index, nil
}

// SprintPlan creates an actionable plan and gives it to a fresh reviewer.
func SprintPlan(ctx context.Context, env gimbal.Env, brief string) (Sprint, error) {
	gimbal.Set(ctx, "brief", brief)
	planner := gimbal.NewSession(ctx, gimbal.RoleSprintPlanning, env.WorkDir)
	plan, err := planner.Generate[Sprint](ctx, sprintPrompt)
	if err != nil {
		return Sprint{}, err
	}
	if err := ValidateSprint(plan); err != nil {
		return Sprint{}, err
	}
	gimbal.SetJSON(ctx, "candidate", plan)
	reviewer := gimbal.NewSession(ctx, gimbal.RoleCodeReview, env.WorkDir)
	review, err := reviewer.Generate[Review](ctx, sprintReview)
	if err != nil {
		return Sprint{}, err
	}
	gimbal.SetJSON(ctx, "review", review)
	if len(review.Findings) != 0 {
		return Sprint{}, fmt.Errorf("sprint review: %v", review.Findings)
	}
	return plan, nil
}

const indexPrompt = `Build a compact semantic index of the corpus below. Return four question-driven routes: starting a local run, isolation of concurrent app/database stacks, ownership of workflow semantics, and updating a backend while runs are active. Each answer must cite the relevant supplied source IDs, distinguish requirements from demonstrated support, and be useful to a reader choosing what to open next. Do not invent capabilities. Use only the supplied corpus. Make no file changes.`
const indexReview = `Independently inspect the candidate against the original corpus. Check all four requested retrieval questions, exact source attribution, requirements versus proven support, and unsupported promises. Return concrete findings, or an empty findings list when the index is faithful. Make no changes.`
const sprintPrompt = `Turn the supplied brief into a small sprint of three to five tasks. Name bounded outcomes, earlier task dependencies, and observable acceptance evidence. Cover the local baseline, concurrent stack isolation, cancellation and cleanup, and human-legible observation. Respect the budget and exclusions. This is a proposed plan, not completed work. Make no file changes.`
const sprintReview = `Independently inspect the candidate against the original brief. Check complete coverage, feasible ordering, concrete acceptance, budget, and exclusions. Reject claims of completed implementation, universal restartability, or mandatory Docker for basic local workflows. Return concrete findings, or an empty findings list when the plan is actionable. Make no changes.`

Out / recorded result

Four routes. All references resolve to the fixture. Independent review found no material fidelity gaps.

How do I start a representative local run?

Requirement: a representative single-process CLI and GUI workflow must run without containers or network infrastructure. Demonstrated support: none is stated; this fixture explicitly records a requirement, not a passed test. Open [local] to verify implementation evidence, and check any individual tool’s declared network needs.

Sources: local
How are concurrent application/database stacks isolated?

Requirement: a multitier host must own startup, routing, workspace/data isolation, and cleanup so concurrent feature stacks cannot collide or access one another’s services or data. Demonstrated support: no universal mechanism is established. Docker networks are only a candidate; plain processes/systemd and Kubernetes are consumer choices, and the mechanism remains undecided. Open [isolation] for the host contract and unresolved mechanism decision.

Sources: isolation
Who owns workflow semantics?

Requirement/design boundary: authored Go owns workflow control flow; Gimbal owns shared agent acceptance, scoped context/lifecycle semantics, and source/event meaning; consumers own compilation, orchestration, worker placement, and storage policy. Demonstrated support: Temporal is one demonstrated target, not mandatory. A named web-app-plus-Postgres profile with explicit app/database handles is only a design candidate, not implemented universal capability. Open [ownership] to determine which layer a proposed change belongs to.

Sources: ownership
How should a backend be updated while runs are active?

Demonstrated support: same-build Temporal replay has been demonstrated in a bounded consumer. Not demonstrated: arbitrary workflow-version migration or restoration of live agent sessions. Operational requirement/guidance: retain a compatible generated build for active runs or drain those runs before replacement; target maintainers own deployment and update policy. Open [updates] for the bounded replay evidence and rollout constraint.

Sources: updates

Structural checks + fresh agent review. One fixture run is not broad quality, target-portability or infrastructure proof.

Evaluated 2026-10-01 15:15:57 UTCCodex app-server · gpt-5.6-lunaGimbal e3891e73875eRecorded snapshot · not a live check
Input, run identity & evaluation boundaries

Run: 01M3W0J2K4D9HGD57QHA2W51GF.semantic-index

Exact source revision: e3891e73875eaf0acc1e8041651bcc29b60477d0

Source SHA-256: 95f968a7df3aee6c0d89af8d5ffc2aef3dde57a11e0c226f2c9e32dc4cd61ef8

Runtime base: 83cdbf6efaa204feb221547fec3bd3bd25172b23. Example source lives on a local branch.

Fixture SHA-256: 2bf35441470fc2e68a4ad42cc769b051e9a9ba5cde83570ac821bf36d1825865

bounded fixture; structural checks and independent agent review; informational, not a release gate. A later Gimbal revision requires a fresh run before transferring this result.

[local] Product requirement: a representative single-process CLI and GUI workflow must run without containers or network infrastructure. Individual tools may declare network needs. This fixture states a requirement, not a passed test.
[isolation] Product requirement: a multitier host owns startup, routing, workspace/data isolation and cleanup. Two concurrent feature stacks must not collide or access each other's services or data. Docker networks are a candidate; plain process/systemd and Kubernetes may be consumer choices. The mechanism is undecided, not universal support.
[ownership] Ordinary authored Go owns workflow control flow. Gimbal supplies shared agent acceptance, scoped context/lifecycle semantics and source/event meaning. Consumers own compilation, orchestration, worker placement and storage policy. Temporal is one demonstrated target, not a mandatory dependency. A named web-app-plus-Postgres profile returning explicit app/database handles is a design candidate, not implemented universal capability.
[updates] Same-build Temporal replay has been demonstrated in a bounded consumer. That does not prove arbitrary workflow-version migration or restoration of live agent sessions. Retain a compatible generated build for its active runs, or drain them before replacing it. Target maintainers own deployment/update policy.
02

Sprint plan

A local multitier trial becomes ordered work with concrete acceptance.

Passed · bounded fixture

In / actual Go source

func SprintPlan(ctx context.Context, env gimbal.Env, brief string) (Sprint, error) {
	gimbal.Set(ctx, "brief", brief)
	planner := gimbal.NewSession(ctx, gimbal.RoleSprintPlanning, env.WorkDir)
	plan, err := planner.Generate[Sprint](ctx, sprintPrompt)
	if err != nil {
		return Sprint{}, err
	}
	if err := ValidateSprint(plan); err != nil {
		return Sprint{}, err
	}
	gimbal.SetJSON(ctx, "candidate", plan)
	reviewer := gimbal.NewSession(ctx, gimbal.RoleCodeReview, env.WorkDir)
	review, err := reviewer.Generate[Review](ctx, sprintReview)
	if err != nil {
		return Sprint{}, err
	}
	gimbal.SetJSON(ctx, "review", review)
	if len(review.Findings) != 0 {
		plan, err = planner.Generate[Sprint](ctx, "Revise the plan against the original brief and the recorded review. Keep it bounded and proposed. Give explicit observable criteria; distinguish the simple local baseline from the multitier trial.")
		if err != nil {
			return plan, err
		}
		if err := ValidateSprint(plan); err != nil {
			return plan, err
		}
		gimbal.SetJSON(ctx, "revised", plan)
		finalReviewer := gimbal.NewSession(ctx, gimbal.RoleCodeReview, env.WorkDir)
		finalReview, err := finalReviewer.Generate[Review](ctx, "Review only the revised plan against the original brief. Inspect whether the earlier findings are resolved, without expanding the assignment. Return concrete material findings or an empty findings list. Make no changes.")
		if err != nil {
			return plan, err
		}
		gimbal.SetJSON(ctx, "final-review", finalReview)
		if len(finalReview.Findings) != 0 {
			return plan, fmt.Errorf("sprint review after one revision: %v", finalReview.Findings)
		}
	}
	return plan, nil
}
Full source, types & prompts
// Package notebook contains two bounded, informational workflow examples.
// They are learning/evaluation material, independent of release or deployment gates.
package notebook

import (
	"context"
	"fmt"
	"github.com/tylergannon/gimbal"
)

//go:generate go tool polytype --validate

// Route connects a reader's question to evidence in the supplied corpus.
type Route struct {
	Question string   `json:"question"`
	Sources  []string `json:"sources"`
	Answer   string   `json:"answer"`
}

// Index is a compact question-driven map, not a vector database.
type Index struct {
	Routes []Route `json:"routes"`
}

// Task is a bounded delivery outcome with dependencies and acceptance evidence.
type Task struct {
	ID         string   `json:"id"`
	Outcome    string   `json:"outcome"`
	DependsOn  []string `json:"depends_on"`
	Acceptance string   `json:"acceptance"`
}

// Sprint is an ordered plan for the supplied goal and constraints.
type Sprint struct {
	Goal  string `json:"goal"`
	Tasks []Task `json:"tasks"`
}

// Review is an independent assessment against the original fixture.
type Review struct {
	Findings []string `json:"findings"`
}

// SemanticIndex creates a retrieval map and gives it to a fresh reviewer.
func SemanticIndex(ctx context.Context, env gimbal.Env, corpus string) (Index, error) {
	gimbal.Set(ctx, "corpus", corpus)
	author := gimbal.NewSession(ctx, gimbal.RoleBulkClassification, env.WorkDir)
	index, err := author.Generate[Index](ctx, indexPrompt)
	if err != nil {
		return Index{}, err
	}
	if err := ValidateIndex(index); err != nil {
		return Index{}, err
	}
	gimbal.SetJSON(ctx, "candidate", index)
	reviewer := gimbal.NewSession(ctx, gimbal.RoleCodeReview, env.WorkDir)
	review, err := reviewer.Generate[Review](ctx, indexReview)
	if err != nil {
		return Index{}, err
	}
	gimbal.SetJSON(ctx, "review", review)
	if len(review.Findings) != 0 {
		return Index{}, fmt.Errorf("index review: %v", review.Findings)
	}
	return index, nil
}

// SprintPlan creates an actionable plan and gives it to a fresh reviewer.
func SprintPlan(ctx context.Context, env gimbal.Env, brief string) (Sprint, error) {
	gimbal.Set(ctx, "brief", brief)
	planner := gimbal.NewSession(ctx, gimbal.RoleSprintPlanning, env.WorkDir)
	plan, err := planner.Generate[Sprint](ctx, sprintPrompt)
	if err != nil {
		return Sprint{}, err
	}
	if err := ValidateSprint(plan); err != nil {
		return Sprint{}, err
	}
	gimbal.SetJSON(ctx, "candidate", plan)
	reviewer := gimbal.NewSession(ctx, gimbal.RoleCodeReview, env.WorkDir)
	review, err := reviewer.Generate[Review](ctx, sprintReview)
	if err != nil {
		return Sprint{}, err
	}
	gimbal.SetJSON(ctx, "review", review)
	if len(review.Findings) != 0 {
		plan, err = planner.Generate[Sprint](ctx, "Revise the plan against the original brief and the recorded review. Keep it bounded and proposed. Give explicit observable criteria; distinguish the simple local baseline from the multitier trial.")
		if err != nil {
			return plan, err
		}
		if err := ValidateSprint(plan); err != nil {
			return plan, err
		}
		gimbal.SetJSON(ctx, "revised", plan)
		finalReviewer := gimbal.NewSession(ctx, gimbal.RoleCodeReview, env.WorkDir)
		finalReview, err := finalReviewer.Generate[Review](ctx, "Review only the revised plan against the original brief. Inspect whether the earlier findings are resolved, without expanding the assignment. Return concrete material findings or an empty findings list. Make no changes.")
		if err != nil {
			return plan, err
		}
		gimbal.SetJSON(ctx, "final-review", finalReview)
		if len(finalReview.Findings) != 0 {
			return plan, fmt.Errorf("sprint review after one revision: %v", finalReview.Findings)
		}
	}
	return plan, nil
}

const indexPrompt = `Build a compact semantic index of the corpus below. Return four question-driven routes: starting a local run, isolation of concurrent app/database stacks, ownership of workflow semantics, and updating a backend while runs are active. Each answer must cite the relevant supplied source IDs, distinguish requirements from demonstrated support, and be useful to a reader choosing what to open next. Do not invent capabilities. Use only the supplied corpus. Make no file changes.`
const indexReview = `Independently inspect the candidate against the original corpus. Check all four requested retrieval questions, exact source attribution, requirements versus proven support, and unsupported promises. Return concrete findings, or an empty findings list when the index is faithful. Make no changes.`
const sprintPrompt = `Turn the supplied brief into a small sprint of three to five tasks. Name bounded outcomes, earlier task dependencies, and observable acceptance evidence. The first task must prove the ordinary single-process CLI starts, runs and finishes with container/network infrastructure blocked; this baseline is separate from the app/database trial. Prepare live observation before the trial. Cover concurrent stack isolation, startup failure after partial allocation, cancellation of an active run, and cleanup within a stated time measured from failure/cancellation. State the measurable pass condition for each task. Respect the budget and exclusions. This is a proposed plan, not completed work. Make no file changes.`
const sprintReview = `Independently inspect the candidate against the original brief. Check complete coverage, feasible ordering, concrete acceptance, budget, and exclusions. Reject claims of completed implementation, universal restartability, or mandatory Docker for basic local workflows. Return concrete findings, or an empty findings list when the plan is actionable. Make no changes.`

Out / recorded result

Demonstrate two isolated concurrent web-app-plus-Postgres development stacks on one consumer-owned local backend, with an infrastructure-free single-process CLI baseline and observable, bounded failure/cancellation cleanup.

T1 Prove the ordinary single-process CLI baseline operates without required Docker, containers, or network infrastructure.

With container and network infrastructure blocked, the ordinary CLI starts, executes its representative operation, and exits successfully in one process; capture exit status 0 and completion evidence. This test must not exercise the app/database multitier trial.

Depends on: none
T2 Prepare live observation and document the multitier trial boundary, backend choice, handles, workspaces, and cleanup measurement method.

Before any multitier run, a live Gimbal UI observation is active and records startup, progress, trouble, completion, cancellation, and cleanup events with timestamps. The trial records the implementer-selected process or container backend, uses at most two stacks on the local machine, and treats explicit app/database handles as a boundary to evaluate rather than an assumed existing feature.

Depends on: T1
T3 Run two concurrent isolated web-app-plus-Postgres stacks and prove correct routing, workspace/data separation, and absence of cross-stack access.

Both stacks start concurrently and finish their representative workflows successfully; each app reaches only its own database handle, each workspace and database contains its own uniquely identifiable marker, and deliberate cross-stack access attempts fail. The live UI shows distinguishable progress and completion for both stacks, with no more than two stacks and no hosted spend.

Depends on: T2
T4 Exercise partial-allocation startup failure and active-run cancellation, then verify bounded cleanup.

Inject one startup failure after at least one resource has been allocated and cancel one active run after it has begun. For each event, the live UI records the failure or cancellation and cleanup progress; all resources, processes/containers, ports, temporary workspaces, and trial data attributable to the affected stack are gone within 60 seconds measured from the failure or cancellation timestamp, while the unaffected stack remains isolated and usable. Pass only if both cleanup deadlines are met and no cross-stack residue or access is observed.

Depends on: T3

Structural checks + fresh agent review. One fixture run is not broad quality, target-portability or infrastructure proof.

Evaluated 2026-10-01 15:20:40 UTCCodex app-server · gpt-5.6-lunaGimbal 8a4f4663c90bRecorded snapshot · not a live check
Input, run identity & evaluation boundaries

Run: 01M3W0T2HYKEFV6Y9TY0BD6XPB.sprint-plan

Exact source revision: 8a4f4663c90b4406431847b3fad96386ce3a69c9

Source SHA-256: 3a6e99de1206f7c8ca82a65a23709441a77bd582be98b26bdf14eb7e7df08a54

Runtime base: 83cdbf6efaa204feb221547fec3bd3bd25172b23. Example source lives on a local branch.

Fixture SHA-256: 771478fc5d52ffc5e71f5dda752489bdaef495298ece32b84e2dc40c905e5636

bounded fixture; structural checks and independent agent review; informational, not a release gate. A later Gimbal revision requires a fresh run before transferring this result.

Goal: demonstrate two isolated concurrent web-app-plus-Postgres development stacks on a consumer-owned local backend.
Keep the ordinary single-process CLI baseline free of required Docker or network infrastructure. For the multitier trial, use a documented process or container backend selected by the implementer. A named profile returning explicit app/database handles is only a proposal; evaluate that boundary without pretending it already exists.
Prove startup, correct app-to-database routing, separate workspaces/data, and no cross-stack access. Inject one startup failure and one cancellation; demonstrate bounded cleanup. Observe the useful progress and trouble in Gimbal's live UI, rather than treating a passing command as proof of legibility.
Budget: one local machine, at most two stacks; no hosted spend. Exclusions: Kubernetes deployment, universal restartability, automatic workflow-version migration, general compiler language expansion, and release/deployment gates. Produce an actionable sprint plan, not an implementation report.
What failed along the way? Three retained attempts

The first indexing attempt could not reach the stopped local Codex daemon. After starting it through its supported command, a new run completed.

The first sprint run completed its agent turns but failed independent review. The reviewer identified live observation scheduled after the runs and imprecise cleanup/injection criteria. A second attempt still missed explicit baseline proof. The assignment was clarified and the third attempt passed a fresh review. The workflow permits at most one explicit revision per run.

  • T5 is ordered after T3 and T4, but the brief requires observing progress and trouble in Gimbal’s live UI during those runs; a post-run observation task cannot prove live legibility. Prepare the observation before startup and perform it as part of T3/T4, leaving T5 for evidence assembly.
  • T4 does not specify a concrete cleanup bound or how the bound is measured. “Within a declared bound” leaves the acceptance criterion to be invented after execution; state the bound, measurement point, and required result, including cleanup after partial startup allocation and cancellation.
  • T4 does not require proving that the injected failure occurs during startup or that cancellation interrupts an active run. Add explicit injection points and evidence requirements so arbitrary runtime failure/cancellation traces cannot satisfy the acceptance.
  • T5’s broad statement that review confirms all budget limits and exclusions is not concrete acceptance for the named exclusions. Require explicit checks for one machine, at most two stacks, no hosted spend, and no Kubernetes, universal restartability, automatic workflow migration, compiler expansion, or release/deployment gates.

First sprint run: 01M3W0J4KBYSP9YYFJEDEWCAYF.sprint-plan · Gimbal e3891e73875eaf0acc1e8041651bcc29b60477d0. Failed attempts remain failed records.