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.
GrainWhat it is
SpanOne unit of metered work
TurnOne sealed transcript row
TaskOne unit of intent
Session / sittingOne harness conversation — the spine
EpisodeA 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.
AxisQuestionTakes money?
PrincipalWho 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.
ObjectiveWhich slice of that product?Yes — that node and descendants, via episode primary.
Goal (tree)Named slice under an objectiveYes — same rule as an objective node.
EpisodeWhich stretch of turns was for that node?Yes — spend follows the first episode at the winning source.
TouchWhat else did this sitting affect?No. Counts and chips only.
TypeWhat kind of work?Yes, as a grouping of whole-session spend — not a second tree.
Product-attributionWhich product did path mentions point at?Yes, two named readings (inclusive / weighted). Not the tree.
ScopeWhere did writes land?No objective dollars. Where, not what-for.
Span work-typeMechanical / tooling / routing / reasoning / generation?Classifier input. Waste detectors read it.
LaneFrontier / offload / local?Pricing.
OutcomeWhat happened as a result?ROI denominator. Not a tree label.
Declared valueWhat dollar did a human say it was worth?ROI numerator. Absent → ROI undefined.
InitiatedWho opened the sitting?Filter only. Not spend.
Source rankWho 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

StoryEvidenceHonesty
Tree productPlacement on a rootWhat the work was for. Spend via first episode.
Path productMentions in harness session documentsWhat 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

CaseWhat it isWhat to write
MixedThe sitting changed jobSplit episodes (turn order, not clock). Each episode has one primary. Cap 8. No overlap at one version.
ThemeOne job that also hits other productsDo 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

AxisHow money is read
Episode primary (tree)First episode at winning source. Forest figures stay additive.
TouchNever.
TypeWhole-session spend grouped by type.
Path product, inclusiveWhole spend of every session that mentioned the product. Upper bound. Does not partition.
Path product, weightedSession spend × share of that session’s workspace refs. Does partition. Residuals must reconcile.
ScopeNot an objective rollup.
PrincipalFilter / group. Never the join.
Unknown ≠ $0. Unpriced spans are counted, never folded into a ratio as free.

Absences (name the hole)

WordMeansMust not become
Unknown (tree)No episode windowA fake root named other
UnplacedLabelling has not put the sitting on the treeSilently skipped
UnannotatedNo TypeDropped from Type charts (it is a bucket)
No evidence (path product)Session was read; referenced no workspaceMerged with unscanned
UnscannedNo source document to readReported as a measured zero
No scope rowWrites were never measuredEmpty scopes as a fact
ProposedJudge minted a node; you have not acceptedA 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.