# Speech-act taxonomy

## What classification claims

Classification labels the **communicative function** of a segment: what the
speaker is doing, not what they are talking about and not whether they are
right. This is why Layer 1 is described as *content-agnostic* rather than
literally content-free — the classifier reads the text, but it is instructed and
schema-constrained to label function only.

## Units

A contribution is split into **functional segments**, each carrying one primary
act. One turn may contain several segments and several acts.

## The taxonomy

| Family | Acts |
|---|---|
| Information seeking | `question`, `clarification_request`, `verification` |
| Action seeking | `request`, `instruction`, `constraint`, `revision_request` |
| Information provision | `inform`, `answer`, `example`, `evidence` |
| Evaluation | `agreement`, `acceptance`, `disagreement`, `rejection`, `quality_evaluation` |
| Feedback | `acknowledgement`, `positive_feedback`, `negative_feedback` |
| Repair | `correction`, `reformulation`, `misunderstanding_signal`, `metacommunication` |
| Dialogue management | `opening`, `closing`, `topic_shift`, `continuation` |
| Social-relational | `greeting`, `thanks`, `apology`, `self_disclosure` |
| Epistemic regulation | `uncertainty`, `challenge`, `reflection`, `justification_request` |
| Agency | `authorization`, `selection`, `action_confirmation`, `action_cancellation` |
| Other | `unclassifiable` |

## Segment fields

```ts
{
  segmentId, startCharacter, endCharacter,
  primaryAct, secondaryActs[], confidence,
  targetTurnId?,
  initiative: "initiate" | "respond" | "repair" | "manage",
  epistemicPosition: "certain" | "uncertain" | "neutral"
}
```

`initiative` describes the move's role in the exchange. `epistemicPosition`
records how the speaker **marks** their certainty, not whether they are correct.

## How it is constrained

Output is schema-constrained (OpenAI Responses `json_schema` with `strict`, or a
forced Anthropic tool call whose input schema is the same JSON Schema). After
generation the application re-validates independently: enum membership, and
character offsets checked against the actual text so a model cannot invent a
span. A malformed result gets **one** structured repair request naming the
specific problems. If it still fails, a failure state is stored and deterministic
analysis proceeds unaffected.

The prompt instructs the model to classify communicative function, avoid topic
summaries and correctness judgements, use only the minimum supplied context, and
return `unclassifiable` when evidence is inadequate. Confidence below 0.5 raises
`LOW_CLASSIFICATION_CONFIDENCE`.

Prompt and schema are versioned (`speech-act-prompt-1.0.0`,
`speech-act-schema-1.0.0`). Editing either requires a version change.

## Provenance

Results carry `evidenceKind`: `llm_inferred` for a real provider, `rule_based`
for the mock provider. The interface labels them differently. Do not mix the two
in a single analysis.

## Prohibited interpretations

- An act label is not a judgement of quality, correctness or sincerity.
- `agreement` and `acceptance` do not mean the accepted content was right.
- `disagreement` is not conflict, and `correction` is not failure — repair is
  ordinary interactional work.
- `uncertainty` records hedging, not actual knowledge state.
- Act *frequency* is not communicative competence.
