# Seams

A seam is a place the map has not decided yet. Every one has **real types** —
the signature is the handoff, so a ticket lands by replacing a body rather than
by designing an interface.

```
yarn seams          # this list, from the code
```

| Seam | Ticket | What is undecided |
|---|---|---|
| `src/audit/` | #21 | Retention and query design. Every *input* is already fixed by #14, #15 and #16. |
| `src/integration/` | #18 | Formats and transport. Export can never exceed read — fixed by #14. |
| `src/helmdocs/` | #19 | The API/MCP boundary. |
| `src/kickoff/` | #17 | Everything. Starts where release reaches `awarded`. |
| `src/claiming/` | #24 | Verification, and how "Acme Foods Inc" and "Acme Foods" resolve to one org. |
| `src/pricing/` | #29 | The closed set of rate structure types. No model fallback exists, by #15. |
| `src/extraction/` | #30 | Cannot be built or measured before the corpus exists. |
| `src/extraction/completeness.ts` | #30 | Same, and needs *labelled known-misses* to have measurable recall. |
| `src/scheduler/jobs/expiry.ts` | #27 | Per-type expiry rules — the catalogue defines them. |
| `src/auth/entitlement.ts` | #35 | Resolution wiring only. The principle and the tier table are decided. |

## What is deliberately *not* a seam

These are decided, and implemented as real code. Changing them means reopening
a closed ticket, not filling in a blank.

- **`src/db/index.ts`** — the single database entry point. The pool is not
  exported; `withActor` is the only way in.
- **`src/db/privileged.ts`** — the enumerated privileged paths. Three of them.
  Adding a fourth should feel like a decision.
- **`src/release/matrix.ts`** — the release matrix. One rule set, versioned.
- **`src/scoring/routing.ts`** — what a model may decide. Two lanes of six.
