---
title: "Framing"
description: "Product, objective, goal, episode, touch, type, scope, and what takes money."
---

Assay can describe the **same sitting** many ways. Each way answers **one question**. Mixing two questions is how a ledger lies.

This page is the map.

## Grain — name the unit first

Labels hang on a grain. They do not invent one.

| Grain | What it is |
|---|---|
| Span | One unit of metered work |
| Turn | One sealed transcript row |
| Task | One unit of intent |
| Session / sitting | One harness conversation — **the spine** |
| Episode | A range of turns inside one sitting, with one primary on the tree |

`principal` is a dimension. Never the join.

## The matrix

**Takes money?** is the load-bearing column.

| Axis | Question | Takes money? |
|---|---|---|
| **Principal** | Who directed this? | Dimension of spend. Never the join. |
| **Project** (seating) | Where was the session seated? | **No** product answer. Workspace pointer. |
| **Product** (tree) | What **thing** was this for? | **Yes** — subtree of episode primaries. |
| **Objective** | Which **slice** of that product? | **Yes** — that node and descendants, via episode primary. |
| **Goal** (tree) | Named slice **under** an objective | **Yes** — same rule as an objective node. |
| **Episode** | Which **stretch of turns** was for that node? | **Yes** — spend follows the **first** episode at the winning source. |
| **Touch** | What else did this sitting **affect**? | **No.** Counts and chips only. |
| **Type** | What **kind** of work? | **Yes, as a grouping of whole-session spend** — not a second tree. |
| **Product-attribution** | Which product did **path mentions** point at? | **Yes, two named readings** (inclusive / weighted). Not the tree. |
| **Scope** | **Where did writes land?** | **No** objective dollars. Where, not what-for. |
| **Span work-type** | Mechanical / tooling / routing / reasoning / generation? | Classifier input. Waste detectors read it. |
| **Lane** | Frontier / offload / local? | Pricing. |
| **Outcome** | What happened as a result? | ROI denominator. Not a tree label. |
| **Declared value** | What dollar did a human say it was worth? | ROI numerator. Absent → ROI **undefined**. |
| **Initiated** | Who **opened** the sitting? | Filter only. Not spend. |
| **Source rank** | Who **asserted** the label? | Precedence, not a frame. |

Config `products.groups` maps product names to workspace folders. That map names path-product reports. It is **not** the objective tree.

## How they decompose

```
principal                         who
    └── session_id                the spine (one sitting)
            ├── Type              kind of work (one annotation)
            ├── Episode(s)        1–8 turn ranges
            │     └── primary:
            │           Product (root)
            │             └── Objective
            │                   └── Goal (deeper)
            ├── Touch(es)         other tree nodes — no $
            ├── Product-attribution   path mentions → inclusive / weighted $
            └── Scope             writes landed in repo:slug — no tree $
```

**Product → Objective → Goal** is **one tree**. Display names the depths.

**Type is not on that tree.** A sitting can be Type `build:feature` and still jump Product A → Product B → Product C as **three episodes**.

## Two “product” stories

| Story | Evidence | Honesty |
|---|---|---|
| **Tree product** | Placement on a root | What the work was **for**. Spend via first episode. |
| **Path product** | Mentions in harness session documents | What the sitting **talked about / opened**. Inclusive does not partition. Weighted does. |

`project` on the span is a **third** word. Seating. Not a product.

## Mixed vs theme

| Case | What it is | What to write |
|---|---|---|
| **Mixed** | The sitting **changed job** | Split **episodes** (turn order, not clock). Each episode has one primary. Cap 8. No overlap at one version. |
| **Theme** | One job that **also hits** other products | **Do not split.** Keep the theme as primary. List the others as **touches**. |

Talk does not mint a touch. A write (or a declared scope) must match an **accepted** node that is not already a primary.

## What takes dollars

| Axis | How money is read |
|---|---|
| Episode primary (tree) | First episode at winning source. Forest figures stay additive. |
| Touch | Never. |
| Type | Whole-session spend grouped by type. |
| Path product, **inclusive** | Whole spend of every session that mentioned the product. Upper bound. Does **not** partition. |
| Path product, **weighted** | Session spend × share of that session’s workspace refs. **Does** partition. Residuals must reconcile. |
| Scope | Not an objective rollup. |
| Principal | Filter / group. Never the join. |

Unknown ≠ $0. Unpriced spans are counted, never folded into a ratio as free.

## Absences (name the hole)

| Word | Means | Must not become |
|---|---|---|
| **Unknown** (tree) | No episode window | A fake root named `other` |
| **Unplaced** | Labelling has not put the sitting on the tree | Silently skipped |
| **Unannotated** | No Type | Dropped from Type charts (it is a bucket) |
| **No evidence** (path product) | Session was read; referenced no workspace | Merged with unscanned |
| **Unscanned** | No source document to read | Reported as a measured zero |
| **No scope row** | Writes were never measured | Empty scopes as a fact |
| **Proposed** | Judge minted a node; you have not accepted | A hanging subtree |

## Precedence

For a given overlay, a reader picks **one** label:

**declared > judge > heuristic**

A type you set in the console is in the **declared** family.

Precedence is a property of the **source**, not of the clock. A store with no declarations behaves as before.

Assay admits or refuses a producer's type vocabulary. It does not coerce. The tree taxonomy is this installation's objective nodes.

## Glossary

**Component.** A workspace slug in path-product attribution. Grouped into a product name by `products.groups`.

**Declared.** Producer- or user-asserted label. Beats judge and heuristic.

**Episode.** Inclusive turn range, one primary. Default: the whole sitting.

**Goal (tree).** Display name for a node at depth ≥ 2. Same storage as Objective.

**Goal (old).** Former name of **Type**. Do not use “Goal” for kind of work on the console.

**Heuristic.** Cheap label from derived features, no full content.

**Inclusive.** Path-product reading: whole session spend if it mentioned the product. Does not partition.

**Judge.** Local (or opted-in) model label. Mints **proposals** on the tree, not accepted nodes.

**Lane.** `frontier` / `offload` / `local`. Pricing axis.

**Mixed.** Episodes with **different** primaries in one sitting.

**Objective.** Tree node: a slice of a product.

**Primary.** The tree node on an episode. Spend sits here.

**Principal.** Who directed. Dimension. Never a join key.

**Product (tree).** Forest root. Result of one or more objectives.

**Product (path).** Derived from mentions in session documents. Two readings, both named.

**Project.** Where the session was seated. Not what it built.

**Proposed.** Judge-minted node awaiting accept.

**Scope.** Where writes landed (`repo:<slug>`). Writes only. Working directory and reads do not count.

**Session / sitting.** One harness conversation.

**Source rank.** `declared > judge > heuristic`. User ⊆ declared.

**Span.** Immutable metered event.

**Task.** Unit of intent. Outcome grain.

**Theme.** One primary, plus touches. Do not split.

**Touch.** Extra edge to a tree node this sitting affected. No dollars.

**Turn.** Sealed transcript row. Episode bounds use turn ids.

**Type.** Kind of work. Closed vocabulary. Session grain.

**Unannotated.** No Type row.

**Unknown (tree).** No episode window.

**Unplaced.** Sitting the labeler has not put on the tree.

**Unpriced.** Cost absent, not $0.

**Weighted.** Path-product reading that partitions by reference share.

**Work-type (span).** Classifier tag on a span. Not Type.
