# internal/app/acceptance

Package acceptance runs and evaluates a task's acceptance criteria, from commands and recorded manual evidence, without changing lifecycle or session state.

## Evaluate

```go
func Evaluate(ctx context.Context, runner Runner, input EvaluateInput) EvaluateOutput
```

Evaluate runs and evaluates criteria without mutating lifecycle or session state.

## Criterion

```go
type Criterion struct {
	ID             string
	Type           string
	Command        string
	ExpectedKind   string
	ManualEvidence *ManualEvidence
}
```

Criterion is the app-level acceptance criterion shape shared by build and gate.

- `ID: string`: 
- `Type: string`: 
- `Command: string`: 
- `ExpectedKind: string`: 
- `ManualEvidence: *ManualEvidence`: 

## CriterionResult

```go
type CriterionResult struct {
	ID                 string
	Type               string
	Command            string
	ExpectedKind       string
	Status             string
	ExitCode           int
	Reason             string
	DiagnosticPath     string
	Evidence           string
	EvidenceDigest     string
	EvidenceActor      string
	EvidenceRecordedAt string
	StdoutDigest       string
	StderrDigest       string
	StartedAt          time.Time
	EndedAt            time.Time
}
```

CriterionResult is immutable evidence for one evaluated criterion.

- `ID: string`: 
- `Type: string`: 
- `Command: string`: 
- `ExpectedKind: string`: 
- `Status: string`: 
- `ExitCode: int`: 
- `Reason: string`: 
- `DiagnosticPath: string`: 
- `Evidence: string`: 
- `EvidenceDigest: string`: 
- `EvidenceActor: string`: 
- `EvidenceRecordedAt: string`: 
- `StdoutDigest: string`: 
- `StderrDigest: string`: 
- `StartedAt: time.Time`: 
- `EndedAt: time.Time`: 

## EvaluateInput

```go
type EvaluateInput struct {
	Criteria      []Criterion
	WorkDir       string
	Env           []string
	EnvMode       execution.EnvMode
	Timeout       time.Duration
	IdleTimeout   time.Duration
	DiagnosticDir string
	// FailFast stops evaluation after the first non-pass criterion. The gate sets
	// it so a red criterion cannot run later commands (which could mutate the
	// workspace); build leaves it false to record every criterion.
	FailFast bool
}
```

EvaluateInput describes criteria and execution settings for one acceptance pass.

- `Criteria: []Criterion`: 
- `WorkDir: string`: 
- `Env: []string`: 
- `EnvMode: execution.EnvMode`: 
- `Timeout: time.Duration`: 
- `IdleTimeout: time.Duration`: 
- `DiagnosticDir: string`: 
- `FailFast: bool`: FailFast stops evaluation after the first non-pass criterion. The gate sets it so a red criterion cannot run later commands (which could mutate the workspace); build leaves it false to record every criterion.

## EvaluateOutput

```go
type EvaluateOutput struct {
	Results []CriterionResult
	Passed  bool
}
```

EvaluateOutput summarizes evaluated criteria.

- `Results: []CriterionResult`: 
- `Passed: bool`: 

## ManualEvidence

```go
type ManualEvidence struct {
	Disposition    string
	EvidenceDigest string
	Actor          string
	RecordedAt     string
	Reason         string
}
```

ManualEvidence is an already-recorded operator disposition for a manual criterion. It is accepted only after the lifecycle command validates and persists the corresponding session event.

- `Disposition: string`: 
- `EvidenceDigest: string`: 
- `Actor: string`: 
- `RecordedAt: string`: 
- `Reason: string`: 

## Runner

```go
type Runner interface {
	Run(context.Context, execution.Request) (execution.Result, error)
}
```

Runner executes acceptance commands.

- `Run: func(context.Context, execution.Request) (execution.Result, error)`:
