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. |
products.groups maps product names to workspace folders. That map names path-product reports. It is not the objective tree.
How they decompose
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. |
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. |
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 byproducts.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.