Validation content failures are returned as successful run responses (`200`) with `validation.status = "failed"`; raw model output is preserved in `raw_model_output`.
Error response shape:
```json
{
"error": {
"code": "artifact_read_failed",
"message": "failed to read input artifact"
}
}
```
## Prompt Profile Authoring
### Minimal Markdown profile
```yaml
id: generic.markdown_summary
version: "1.0.0"
expected_inputs:
- transcript
templates:
- role: system
content: "You are a concise assistant."
- role: user
content: |
Summarize:
{{input "transcript"}}
model_defaults:
endpoint: http://localhost:8000/v1
model: gpt-4o-mini
temperature: 0.2
max_tokens: 700
output_format: markdown
validation:
validation_mode: basic
```
### Structured JSON profile with schema validation
```yaml
id: generic.structured_events
version: "1.0.0"
expected_inputs:
- transcript
templates:
- role: system
content: "Return only JSON."
- role: user
content: |
Extract events from:
{{input "transcript"}}
model_defaults:
endpoint: http://localhost:8000/v1
model: gpt-4o-mini
output_format: json
validation:
format: json
validation_mode: json_schema
schema_path: structured_events.schema.json
repair_attempts: 1
```
`repair_attempts` is bounded. Repair is attempted only for structured validation modes.
## Validation Modes
Supported modes:
-`none`: skipped validation result.
-`basic`: fails if output is empty/whitespace.
-`json`: output must parse as JSON.
-`json_schema`: output must parse as JSON and satisfy the configured schema.
Validation failures caused by output content are represented in `validation` and do not discard raw model output.
## Repository Examples
- Profiles: `profiles/`
- Schemas: `schemas/`
- Fixtures: `examples/fixtures/`
- Local experimentation: `local-test/`
## Development Notes
- Core is generic and follows a ports-and-adapters style.
- Domain/usecase packages do not depend on HTTP/CLI/wire types.
- To add a new LLM adapter: implement `internal/llm.Client`.
- To add a new artifact reader: implement/extend `internal/artifact.Reader` routing.
- To add a new validation mode: extend `internal/validate` and keep run semantics stable.