# internal/app/config

Package config prepares evidence-backed workspace configuration proposals.

## Run

```go
func Run(ctx context.Context, scanner Scanner) (Output, error)
```

Run builds a deterministic proposal from scanner evidence.

## AgentInstructions

```go
type AgentInstructions struct {
	Role         string   `json:"role" yaml:"role"`
	Deliverables []string `json:"deliverables" yaml:"deliverables"`
	Rules        []string `json:"rules" yaml:"rules"`
}
```

AgentInstructions tells the consuming agent how to turn evidence into real project configuration without inventing unsupported runtime fields.

- `Role: string` (json:"role" yaml:"role"): 
- `Deliverables: []string` (json:"deliverables" yaml:"deliverables"): 
- `Rules: []string` (json:"rules" yaml:"rules"): 

## CommandSuggestion

```go
type CommandSuggestion struct {
	ID      string   `json:"id" yaml:"id"`
	Command string   `json:"command" yaml:"command"`
	Sources []string `json:"sources" yaml:"sources"`
}
```

CommandSuggestion is an inferred validation command with source evidence.

- `ID: string` (json:"id" yaml:"id"): 
- `Command: string` (json:"command" yaml:"command"): 
- `Sources: []string` (json:"sources" yaml:"sources"): 

## ConfigPatch

```go
type ConfigPatch struct {
	Invariants map[string]string `json:"invariants" yaml:"invariants"`
	Execution  *ExecutionPatch   `json:"execution,omitempty" yaml:"execution,omitempty"`
}
```

ConfigPatch contains concrete changes that may be copied into config.yaml after review.

- `Invariants: map[string]string` (json:"invariants" yaml:"invariants"): 
- `Execution: *ExecutionPatch` (json:"execution,omitempty" yaml:"execution,omitempty"): 

## Evidence

```go
type Evidence struct {
	Path string `json:"path" yaml:"path"`
	Role string `json:"role" yaml:"role"`
}
```

Evidence records one discovered project artifact.

- `Path: string` (json:"path" yaml:"path"): 
- `Role: string` (json:"role" yaml:"role"): 

## ExecutionPatch

```go
type ExecutionPatch struct {
	PathPrepend []string          `json:"path_prepend,omitempty" yaml:"path_prepend,omitempty"`
	Env         map[string]string `json:"env,omitempty" yaml:"env,omitempty"`
}
```

ExecutionPatch is the copyable runtime config fragment for acceptance commands.

- `PathPrepend: []string` (json:"path_prepend,omitempty" yaml:"path_prepend,omitempty"): 
- `Env: map[string]string` (json:"env,omitempty" yaml:"env,omitempty"): 

## ExecutionSuggestion

```go
type ExecutionSuggestion struct {
	PathPrepend []string          `json:"path_prepend,omitempty" yaml:"path_prepend,omitempty"`
	Env         map[string]string `json:"env,omitempty" yaml:"env,omitempty"`
	Sources     []string          `json:"sources" yaml:"sources"`
}
```

ExecutionSuggestion is an inferred acceptance-command environment.

- `PathPrepend: []string` (json:"path_prepend,omitempty" yaml:"path_prepend,omitempty"): 
- `Env: map[string]string` (json:"env,omitempty" yaml:"env,omitempty"): 
- `Sources: []string` (json:"sources" yaml:"sources"): 

## InvariantSuggestion

```go
type InvariantSuggestion struct {
	ID          string   `json:"id" yaml:"id"`
	Description string   `json:"description" yaml:"description"`
	Sources     []string `json:"sources" yaml:"sources"`
}
```

InvariantSuggestion is an inferred project invariant with source evidence.

- `ID: string` (json:"id" yaml:"id"): 
- `Description: string` (json:"description" yaml:"description"): 
- `Sources: []string` (json:"sources" yaml:"sources"): 

## Output

```go
type Output struct {
	Path     string   `json:"path"`
	Proposal Proposal `json:"proposal"`
	Prompt   string   `json:"prompt"`
}
```

Output describes a config run.

- `Path: string` (json:"path"): 
- `Proposal: Proposal` (json:"proposal"): 
- `Prompt: string` (json:"prompt"): 

## Proposal

```go
type Proposal struct {
	Version           string            `json:"version" yaml:"version"`
	Purpose           string            `json:"purpose" yaml:"purpose"`
	AgentInstructions AgentInstructions `json:"agent_instructions" yaml:"agent_instructions"`
	Evidence          []Evidence        `json:"evidence" yaml:"evidence"`
	ConfigPatch       ConfigPatch       `json:"config_patch" yaml:"config_patch"`
	SpecGuidance      SpecGuidance      `json:"spec_guidance,omitempty" yaml:"spec_guidance,omitempty"`
	Warnings          []Warning         `json:"warnings,omitempty" yaml:"warnings,omitempty"`
	OpenQuestions     []Question        `json:"open_questions,omitempty" yaml:"open_questions,omitempty"`
}
```

Proposal is the written config proposal. It is intentionally not the runtime config schema; humans and agents must review it before applying changes.

- `Version: string` (json:"version" yaml:"version"): 
- `Purpose: string` (json:"purpose" yaml:"purpose"): 
- `AgentInstructions: AgentInstructions` (json:"agent_instructions" yaml:"agent_instructions"): 
- `Evidence: []Evidence` (json:"evidence" yaml:"evidence"): 
- `ConfigPatch: ConfigPatch` (json:"config_patch" yaml:"config_patch"): 
- `SpecGuidance: SpecGuidance` (json:"spec_guidance,omitempty" yaml:"spec_guidance,omitempty"): 
- `Warnings: []Warning` (json:"warnings,omitempty" yaml:"warnings,omitempty"): 
- `OpenQuestions: []Question` (json:"open_questions,omitempty" yaml:"open_questions,omitempty"): 

## Question

```go
type Question struct {
	Question string   `json:"question" yaml:"question"`
	Reason   string   `json:"reason" yaml:"reason"`
	Sources  []string `json:"sources,omitempty" yaml:"sources,omitempty"`
}
```

Question records a missing policy decision that could not be inferred.

- `Question: string` (json:"question" yaml:"question"): 
- `Reason: string` (json:"reason" yaml:"reason"): 
- `Sources: []string` (json:"sources,omitempty" yaml:"sources,omitempty"): 

## Scanner

```go
type Scanner interface {
	Scan(context.Context) (Snapshot, error)
}
```

Scanner inspects a workspace without mutating it.

- `Scan: func(context.Context) (Snapshot, error)`: 

## Snapshot

```go
type Snapshot struct {
	Root       string
	Files      []Evidence
	Commands   []CommandSuggestion
	Invariants []InvariantSuggestion
	Execution  *ExecutionSuggestion
	Warnings   []Warning
	Questions  []Question
}
```

Snapshot is the evidence discovered from a workspace.

- `Root: string`: 
- `Files: []Evidence`: 
- `Commands: []CommandSuggestion`: 
- `Invariants: []InvariantSuggestion`: 
- `Execution: *ExecutionSuggestion`: 
- `Warnings: []Warning`: 
- `Questions: []Question`: 

## SpecGuidance

```go
type SpecGuidance struct {
	Commands    []CommandSuggestion   `json:"commands,omitempty" yaml:"commands,omitempty"`
	ReviewFocus []InvariantSuggestion `json:"review_focus,omitempty" yaml:"review_focus,omitempty"`
	Execution   *ExecutionSuggestion  `json:"execution,omitempty" yaml:"execution,omitempty"`
}
```

SpecGuidance contains repo facts useful to future specs, but not read from runtime config.

- `Commands: []CommandSuggestion` (json:"commands,omitempty" yaml:"commands,omitempty"): 
- `ReviewFocus: []InvariantSuggestion` (json:"review_focus,omitempty" yaml:"review_focus,omitempty"): 
- `Execution: *ExecutionSuggestion` (json:"execution,omitempty" yaml:"execution,omitempty"): 

## Warning

```go
type Warning struct {
	ID      string   `json:"id" yaml:"id"`
	Message string   `json:"message" yaml:"message"`
	Sources []string `json:"sources,omitempty" yaml:"sources,omitempty"`
}
```

Warning records stale or suspicious project config state.

- `ID: string` (json:"id" yaml:"id"): 
- `Message: string` (json:"message" yaml:"message"): 
- `Sources: []string` (json:"sources,omitempty" yaml:"sources,omitempty"):
