Help us shape the future of Go! Take the 2026 Go Developer Survey

sourceconformance

package
v0.17.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 13, 2026 License: Apache-2.0 Imports: 8 Imported by: 0

Documentation

Overview

Package sourceconformance provides shared conformance test suites for the content-source seams: tool.SkillSource (RunSkillSource), prompt.SoulSource (RunSoulSource), tool.AgentDefSource (RunAgentSource), and prompt.CommandSource (RunCommandSource). Adapters (the filesystem skills/ agents sources, the soul file store, remote drivers, ...) call the Run functions with a factory that constructs a fresh source, and the suites exercise only the port interfaces.

Importing "testing" in a non-_test.go file is intentional here: this is a test-helper package whose sole purpose is to be imported by adapter tests, the conventional Go pattern for shared conformance suites (cf. testing/fstest and the sibling fsconformance/memconformance/storeconformance packages).

The suites pin the CONTRACT, not the implementation: where a skill bundle or soul body comes from (directories, a database, a remote process) is adapter-internal and deliberately NOT asserted. RunSkillSource is driven by the exported canonical Fixture so every backend — the in-memory reference (NewFixtureSource), the filesystem source over a written-out fixture tree, and a driver client over a wire server — answers for the SAME bundles.

Index

Constants

This section is empty.

Variables

View Source
var AgentFixture = []tool.AgentDef{
	{
		Name:        "echo",
		Description: "Repeats the task back with findings.",
		Body:        "Restate the task, then answer it directly.",
	},
	{
		Name:            "full-stack",
		Description:     "A fully-loaded specialist exercising every optional field.",
		Tools:           []string{"Read", "Grep", "Glob"},
		DisallowedTools: []string{"Write"},
		Model:           "sonnet",
		Provider:        "openrouter",
		PermissionMode:  "plan",
		MaxTurns:        7,
		MaxToolCalls:    21,
		Color:           "blue",
		Skills:          []string{"review", "research"},
		Hooks: map[string]string{
			"PreToolUse": "echo pre",
			"Stop":       "echo done",
		},
		Body: "You are a meticulous full-stack specialist.\nInspect before you conclude.",
	},
	{
		Name:        "mcp-ops",
		Description: "Operates over scoped MCP servers.",
		MCPServers: []tool.AgentMCPServer{
			{Name: "github"},
			{
				Name:    "inline-auth",
				URL:     "https://example.test/mcp",
				Headers: map[string]string{"Authorization": "Bearer fixture-token"},
			},
		},
		Body: "Use the scoped MCP tools to inspect the project boards.",
	},
}

AgentFixture is the canonical agent-definition set RunAgentSource asserts against, sorted by Name. It covers the three shapes the suite needs: a minimal def (name + description + body only), a fully-loaded def (tools, disallowed tools, model, provider, permission mode, limits, color, skills, hooks), and an MCP-bearing def (one REFERENCE entry + one INLINE entry with secret-shaped headers).

The fixture is authored to ROUND-TRIP the filesystem frontmatter parser: bodies are trimmed, descriptions are single-line and under the always-in-context cap, and hooks/headers are pre-normalized (trimmed keys and values, no empties) — so the FS backend writing these out as <name>.md and re-discovering them answers byte-identically. Origin is deliberately UNSET here: each backend stamps its own admission tier, and the suite asserts only that it is non-empty.

View Source
var CommandFixture = []FixtureCommand{
	{
		Name:        "fix",
		Description: "Fix a reported bug.",
		Body:        "Fix the bug in $1 and add a regression test.",
	},
	{
		Name:        "pr.merge-2",
		Description: "Merge a pull request (grammar: letters, digits, '-', '_', '.').",
		Body:        "Merge PR $1 once checks pass.",
	},
	{
		Name:        "review",
		Description: "Run a structured review.",
		Body:        "---\ndescription: Run a structured review.\n---\nReview $ARGUMENTS for correctness first, style second.",
	},
}

CommandFixture is the canonical command set RunCommandSource asserts against, sorted by Name. It covers a frontmatter-less positional template, a punctuation-bearing name (the full invocation grammar), and a frontmatter-bearing template with $ARGUMENTS — the raw body keeps its frontmatter so the round-trip subtest proves the source never strips.

View Source
var Fixture = []FixtureSkill{
	{
		Name:        "commit-style",
		Description: "Write conventional commits.",
		Body:        "type(scope): subject\nWrap the body at 72 columns.",
	},
	{
		Name:        "research",
		Description: "Deep research with nested references.",
		Body:        "Start from references/deep/sources.md and cite everything.",
		Assets: []FixtureAsset{
			{Name: "references/deep/sources.md", Content: "primary sources only\n"},
		},
	},
	{
		Name:          "review",
		Description:   "Run a structured code review.",
		Body:          "Follow references/checklist.md, then run scripts/lint.sh.",
		License:       "MIT",
		Compatibility: "mecatl >= 0.1",
		Metadata: map[string]string{
			"author":  "stacklok",
			"version": "1",
		},
		AllowedTools: []string{"Read", "Grep", "Shell"},
		Assets: []FixtureAsset{
			{Name: "references/checklist.md", Content: "- correctness first\n- style second\n"},
			{Name: "scripts/lint.sh", Content: "#!/bin/sh\necho lint\n", Executable: true},
		},
	},
}

Fixture is the canonical skill set RunSkillSource asserts against, sorted by Name. It covers the three shapes the suite needs: a skill with a text asset AND an executable asset (review), an asset-less skill (commit-style), and a skill with a multi-segment logical asset name (research).

View Source
var RuleFixture = []prompt.Rule{
	{
		Name: "api",
		Body: "Follow the API style guide for every endpoint.",
	},
	{
		Name:  "go-style",
		Body:  "Run gofmt and go vet before committing.",
		Paths: []string{"**/*.go", "go.mod"},
	},
	{
		Name:  "testing",
		Body:  "Write table-driven tests with t.Run subtests.",
		Paths: []string{"**/*_test.go"},
	},
}

RuleFixture is the canonical rule set RunRulesSource asserts against, sorted by Name. It covers the three shapes the suite needs: an unconditional rule (no paths), a single-glob path-scoped rule, and a two-glob path-scoped rule.

The fixture is authored to ROUND-TRIP the filesystem frontmatter parser: bodies are trimmed and globs are written as a YAML sequence — so the FS backend writing these out as <name>.md and re-discovering them answers byte-identically. Origin is deliberately UNSET here: each backend stamps its own admission tier, and the suite asserts only that it is non-empty.

Functions

func NewAgentFixtureSource

func NewAgentFixtureSource() tool.AgentDefSource

NewAgentFixtureSource returns the in-memory REFERENCE tool.AgentDefSource serving exactly the canonical AgentFixture, with the explicit tier stamped. It lives here (not in a _test.go file) because the driver conformance fixtures mount it behind a wire server; it is also the suite's self-test subject, so the suite cannot smuggle filesystem-shaped assumptions.

func NewCommandFixtureSource

func NewCommandFixtureSource() prompt.CommandSource

NewCommandFixtureSource returns the in-memory REFERENCE prompt.CommandSource serving exactly the canonical CommandFixture. It lives here (not in a _test.go file) because the driver conformance fixtures mount it behind a wire server; it is also the suite's self-test subject.

func NewFixtureSource

func NewFixtureSource() tool.SkillSource

NewFixtureSource returns the in-memory REFERENCE tool.SkillSource serving exactly the canonical Fixture. It lives here (not in a _test.go file) because the driver conformance fixtures mount it behind a wire server; it is also the suite's self-test subject, so the suite cannot smuggle filesystem-shaped assumptions.

func NewRuleFixtureSource

func NewRuleFixtureSource() prompt.RulesSource

NewRuleFixtureSource returns the in-memory REFERENCE prompt.RulesSource serving exactly the canonical RuleFixture, with the user tier stamped. It lives here (not in a _test.go file) because a future driver conformance fixture mounts it behind a wire server; it is also the suite's self-test subject, so the suite cannot smuggle filesystem-shaped assumptions.

func RunAgentSource

func RunAgentSource(t *testing.T, newSource func(t *testing.T) tool.AgentDefSource)

RunAgentSource executes the shared AgentDefSource conformance table against the source produced by newSource. newSource must return a fresh source serving EXACTLY the canonical AgentFixture each call.

func RunCommandSource

func RunCommandSource(t *testing.T, newSource func(t *testing.T) prompt.CommandSource)

RunCommandSource executes the shared CommandSource conformance table against the source produced by newSource. newSource must return a fresh source serving EXACTLY the canonical CommandFixture each call.

NOTE on lifecycle: the PORT is LIVE-semantics (the set MAY change between calls); the fixture backend is FIXED, so the stability subtest pins only "a fixed backend lists stably", not snapshot semantics.

func RunRulesSource

func RunRulesSource(t *testing.T, newSource func(t *testing.T) prompt.RulesSource)

RunRulesSource executes the shared RulesSource conformance table against the source produced by newSource. newSource must return a fresh source serving EXACTLY the canonical RuleFixture each call.

func RunSkillSource

func RunSkillSource(t *testing.T, newSource func(t *testing.T) tool.SkillSource)

RunSkillSource executes the shared SkillSource conformance table against the source produced by newSource. newSource must return a fresh source serving EXACTLY the canonical Fixture each call.

func RunSoulSource

func RunSoulSource(t *testing.T, newSource func(t *testing.T, body string) prompt.SoulSource)

RunSoulSource executes the shared SoulSource conformance table. newSource must return a fresh source whose backing soul content is exactly body (e.g. a temp file holding body, or a wire server returning it); the suite asserts the FAIL-SOFT load discipline every implementation shares: a clean body round-trips trimmed, and an empty/whitespace-only/fence-breakout body yields ("", nil) — never an error that would abort a run.

Types

type FixtureAsset

type FixtureAsset struct {
	Name       string
	Content    string
	Executable bool
}

FixtureAsset is one auxiliary payload of a fixture skill, addressed by its LOGICAL (slash-separated, relative) name.

type FixtureCommand

type FixtureCommand struct {
	Name        string
	Description string
	Body        string
}

FixtureCommand is one canonical fixture slash command: invocation metadata plus the RAW template body (optional YAML frontmatter INCLUDED — stripping is the expander's job, never the source's, so the body must round-trip verbatim).

type FixtureSkill

type FixtureSkill struct {
	Name        string
	Description string
	Body        string
	Assets      []FixtureAsset
	// License, Compatibility, Metadata, and AllowedTools mirror the like-named
	// SkillMeta fields; advisory only.
	License       string
	Compatibility string
	Metadata      map[string]string
	AllowedTools  []string
}

FixtureSkill is one canonical fixture skill: metadata + instruction body + auxiliary payloads. The Body is a trimmed string (no leading/trailing whitespace) so filesystem backends that trim on parse round-trip it exactly.

License, Compatibility, Metadata, and AllowedTools are the OPTIONAL ADVISORY frontmatter fields (issue #419); they are advisory/observability only and mirror SkillMeta. Populate them on at least one fixture so the conformance contract pins their round-trip across every backend; zero values are exercised by the fixtures that omit them. AllowedTools (agentskills.io Experimental) is NEVER a permission grant — advisory only.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL