# 079 operator-composition — RESULT  (Campaign100 MANIFEST row 079 — BLOCK J, next to 078)

**Tier: T3-exploratory.** Single embedder (SONAR z, night8 pipeline), templated minimal-pair
stimuli, single LLM judge (local codex, neutral rubric, **0 parse errors**). No promotion above T3.
Box tmux `c100_079` (CPU, CVD="") decode-only: 384 items → 1417 texts → **1152 decode jobs**,
det_ok=True, 492.7 s. LOCAL codex judge (this harvest): **1152 records, 0 parse errors, 460 s**,
batch 50, effort=low. Analysis local (`uv run --with numpy`).

## Question
033 found SONAR z is a linear offset-operator space for morphosyntax and that **tense∘number
composes at ~1.00**. 078 extended linearity to **relational markers** (vertical/temporal/containment/
proximity/comparative ≈0.99) while relational **argument swaps** hit the binding wall (spatial_swap
diff_align 0.15, 0/N). This asks the **quantitative composition** question for the operators that DO
linearize: is the double-transform offset the SUM of the two singles — **v(A∘B) ≈ v(A)+v(B)**
(additivity) — does `decode(z+v(A)+v(B))` realize the double transform as well as the directly-fit
`v(AB)` does (**compose−direct gap**), and is it **order-invariant** (commutative)? And does a
constituent that is itself non-linear (spatial_swap) break composition?

## Headline ★ POSITIVE — THE LINEARIZING OPERATORS COMPOSE ADDITIVELY, INCLUDING CROSS-FAMILY; THE CONTROL FAILS IN DECODE, NOT IN COSINE
All five linearizing pairs are **additive** (cos(v(A)+v(B), v(AB)) 0.97–0.996) and the composed
offset decodes the double transform at **exactly the same success as the directly-fit offset**
(compose−direct gap = **0.000 for every pair**), at **1.00 (4 pairs) / 0.958 (1 pair)** success,
with **perfect order-invariance** (seqAB = seqBA, asymmetry 0.000 everywhere). 033's grammatical
compose result generalises across the expanded zoo **and across families**: the cross-family pair
**vertical (relational marker) × tense (grammatical) composes at 1.00, additivity 0.996**. The
non-additive control (spatial_swap × tense) **fails composition (0.00)** — but its additivity cosine
is a **degenerate 0.999**, so its failure is visible **only in decode success, not in cosine**.

| pair | class | additivity cos | compose succ | direct succ | Δ(comp−dir) | single A / B | seqAB / seqBA | order asym | verdict |
|------|-------|---------------|-------------|------------|-------------|-------------|--------------|-----------|---------|
| tense × number       | grammatical (033 replication) | 0.973 | **1.00** | 1.00 | 0.000 | 1.00 / 1.00 | 1.00 / 1.00 | 0.00 | **composes** |
| negation × number    | grammatical | 0.988 | **1.00** | 1.00 | 0.000 | 1.00 / 1.00 | 1.00 / 1.00 | 0.00 | **composes** |
| negation × tense     | grammatical | 0.972 | **0.958** | 0.958 | 0.000 | 0.958 / 0.958 | 0.958 / 0.958 | 0.00 | **composes** |
| question × number    | grammatical | 0.982 | **1.00** | 1.00 | 0.000 | 1.00 / 1.00 | 1.00 / 1.00 | 0.00 | **composes** |
| vertical × tense     | **cross-family** (marker × grammatical) | 0.996 | **1.00** | 1.00 | 0.000 | 1.00 / 1.00 | 1.00 / 1.00 | 0.00 | **composes** |
| spatial_swap × tense | **CONTROL** (arg-swap × grammatical) | 0.999 ⚠︎degenerate | **0.00** | 0.00 | 0.000 | **0.00 / 1.00** | 0.00 / 0.00 | 0.00 | **fails to compose** |

Success = strict `applied == "yes"` (codex), n=24 test items/pair/kind. Δ(comp−dir) is the
compose-minus-direct success gap. "single A / B" = single-op positive controls (decode z+v(A),
z+v(B) applies A resp. B).

## Do the linearizing operators compose? — YES (additive, gap-free, commutative)
- **Additivity holds**: mean cos(v(A)+v(B), v(AB)) over the 5 linearizing pairs = **0.9822** (range
  0.972–0.996). The two single-op directions are near-orthogonal (cos(v(A),v(B)) 0.02–0.05), so the
  sum is a genuine two-axis move, not one operator dominating.
- **Composed = directly-fit**: `decode(z+v(A)+v(B))` and `decode(z+v(AB))` realize the double
  transform at **identical rates on all 6 pairs** (gap 0.000). Fitting the double offset directly
  buys nothing over summing the two singles — the offset algebra is linear end-to-end through the
  decoder, not merely at the z-cosine level.
- **Commutative**: sequential-decode order-invariance is exact — seqAB = seqBA for every pair,
  |AB−BA| = 0.000, with seq_text_match 0.875–1.00 (identical decoded strings in most items). Adding
  the offsets in either order, with a re-encode round-trip in between, lands on the same sentence.
- **Cross-family composition works**: vertical×tense (a 078 relational-marker offset + a 033
  grammatical offset) composes at 1.00 with additivity 0.996 — the marker and grammatical operator
  live on independent, commuting axes. This directly answers 078's follow-up #1 (does
  offset_marker ∘ offset_grammatical apply both flips additively): **yes**.

## The control: decode-not-cosine failure (methodological point)
spatial_swap × tense is the pre-registered **non-additive control**. Its behaviour is the crux of
this experiment:
- **Single-op controls split**: singleB (tense) = **1.00**, singleA (spatial_swap) = **0.00**. The
  swap "operator" is a null/incoherent direction — norm 0.023 and diff_align_A 0.179 (078's binding
  wall reproduced), i.e. there is no transferable linear operand-reversal offset.
- **Composition fails in decode**: compose = direct = **0.00**. The composed offset applies the
  tense change and preserves the nouns (compose_preserved 0.83) but **never swaps the operands**
  (e.g. base "The bookcase is above the fence" → compose "The bookshelf was above the fence";
  target "The fence was above the bookcase"). The double transform IS reachable — **ceiling
  (decode true z_AB) = 1.00** — the composed offset simply cannot reach it.
- **Yet additivity cosine is degenerate 0.999.** Because v(A) (swap) has near-null norm and a near-
  random direction, v(A)+v(B) ≈ v(B) ≈ v(AB) (all three are essentially the tense offset), so
  cos(v(A)+v(B), v(AB)) ≈ 1. **The additivity cosine is high precisely because one constituent
  operator is null** — the opposite of the intended reading.

**Lesson: cosine additivity is necessary-but-not-sufficient for working composition.** For a pair
where one constituent is a near-null / non-linear direction, additivity cosine is trivially high
while the composition genuinely fails to decode. The control's failure is legible **only in decode
success (0.00), never in cosine (0.999)**. Any future composition study must gate on decode success,
not on the additivity cosine alone. (This is exactly the degeneracy flagged at harvest, now
confirmed quantitatively.)

## Gates / sanity
| gate | threshold | value | pass |
|------|-----------|-------|------|
| G_ceiling (decode true z_AB realizes double) | ≥ 0.90 | **1.00** (all 6 pairs) | ✓ |
| G_baseline (decode z_base ≠ double-applied) | ≤ 0.15 | **0.00** (all 6) | ✓ |
| G_control (single-op tense/num/neg/question) | ≥ 0.85 | **0.992** | ✓ |
| G_parse | ≤ 5% | **0.0%** (0/1152) | ✓ |
| G_det | True | **True** | ✓ |
| G_norm (z_base/single/double flat pre-diff) | flat | z-norms 0.186–0.206, flat | ✓ |

All gates pass. Ceiling=1.00 with baseline=0.00 is the fabrication check: the double targets are
decodable and the base is not the double, so the compose/direct successes (and the control's 0.00)
are real, not decoder artifacts. Note the control's ceiling=1.00 makes its 0/24 compose success an
**unambiguous** composition failure (the target was reachable), not a soft-ceiling floor.

## Verdict (honest)
**POSITIVE and clean.** For the operators that linearize, SONAR-z composition is **additive,
gap-free, and commutative** — summing two single-operator offsets is indistinguishable from fitting
the double offset directly, in both z-cosine (0.97–0.996) and end-to-end decode success (gap 0.000),
including a **cross-family** marker×grammatical pair (1.00). 033's tense∘number≈1.0 was not a
special case: it is the general behaviour across the expanded grammatical + relational-marker zoo.
The single non-additive control fails composition exactly as predicted **in decode** (0.00 vs
ceiling 1.00), and it exposes a methodological trap — **its additivity cosine is a degenerate 0.999
because the null swap-operand makes v(A)+v(B)≈v(AB)**. Composition works wherever the constituent
operators are themselves genuine linear offsets, and breaks when any constituent is the binding-wall
null direction; cosine additivity alone cannot tell the two apart.

## Brier (frozen priors, PREREG_LITE, exact)
| pred | statement | prior P | outcome | (P−o)² |
|------|-----------|---------|---------|--------|
| P1 | mean additivity cos over 5 linearizing pairs ≥ 0.80 | 0.80 | **TRUE** (0.982) | 0.0400 |
| P2 | \|compose−direct\| ≤ 0.15 AND both ≥ 0.6 (frac ≥ 0.6) | 0.70 | **TRUE** (frac 1.00, gap 0.000) | 0.0900 |
| P3 | mean single-op success ≥ 0.85 | 0.90 | **TRUE** (0.992) | 0.0100 |
| P4 | seq order-invariance ≥ 0.7 AND \|AB−BA\| ≤ 0.15 | 0.75 | **TRUE** (seq 0.990, asym 0.000) | 0.0625 |
| P5 | control: additivity < 0.80 AND compose_succ < 0.40 | 0.70 | **FALSE** (compose 0.00 ✓ **but** additivity 0.999 ✗) | 0.4900 |

**Brier = 0.1385** (4/5 hits). The lone miss, **P5**, is *not* a substantive miss: the control's
composition **did** fail (compose_succ 0.00 < 0.40), exactly the intended phenomenon. P5 scores
FALSE only because it was frozen as a conjunction that also required additivity **cos < 0.80**, and
the degenerate near-null swap-operand drives that cosine to 0.999 (a two-clause AND was the wrong
operationalization). Read on the decode clause alone — the one that actually diagnoses composition —
the control fails as predicted. The 0.49 penalty is a prediction-form artifact, not an empirical
surprise (see Limitations).

## Limitations
- **T3 ceiling:** single embedder (SONAR z), single judge (local codex, effort=low), templated
  minimal pairs with a fixed frame/entity set; generalization beyond these templates untested.
- **P5 operationalization, not P5 phenomenon, failed:** the frozen conjunction "additivity<0.80 AND
  compose<0.40" cannot fire when a constituent operator is null (degenerate-high cosine). The
  decode clause (the real signal) confirms the control breaks. Future prereg should predict the
  control on **decode success only**, or on a **norm-normalized / operand-specific** additivity
  metric, not raw cos.
- **negation × tense at 0.958, not 1.00:** a single test item (1/24) is judged non-"yes"
  consistently across all kinds (single, compose, direct, seq) — an item-level artifact, not an
  order- or composition-specific effect (gap and asymmetry both 0.000).
- **vertical low chrF is synonymy, not failure:** vertical×tense compose/direct/ceiling all decode
  "…was **under**…" where the target says "…was **below**…" (chrF ~64), but the judge scores the
  change as applied (1.00) — the below/under lexical drift tanks chrF without affecting the semantic
  composition. This is why judged success, not chrF, is the metric.
- **Only 5 linearizing pairs, 1 control, 24 test items/kind:** a small, hand-picked operator zoo;
  the additive-composition claim is strong within it but not a saturation sweep.
- **Judge leniency:** strict `applied=="yes"` used for success; "preserved" is the collateral check
  and cleanly separates working pairs (0.83–1.00) from nothing here (no pair drifts content).

## Tier: T3-exploratory (no promotion).

## Follow-up: **Y (modest).**
1. **Norm-normalized additivity metric** — replace raw cos(v(A)+v(B),v(AB)) with a metric that is
   NOT degenerate when a constituent is null (e.g. require both diff_align_A and diff_align_B ≥
   threshold before scoring additivity, or report the projection of v(AB) onto span{v(A),v(B)} with
   per-operand coefficients). This would let a single metric flag the control instead of needing the
   decode clause. Directly fixes the P5 form.
2. **Three-way composition** — does v(A)+v(B)+v(C) (e.g. negation × tense × number) still decode
   additively, or does composition degrade with operator count? Tests whether the offset algebra is
   linear at higher order or only pairwise.
3. **More cross-family pairs** — vertical×tense worked; sweep {containment, proximity,
   comparative_size} × {question, number} to confirm marker×grammatical additivity is general and
   not specific to vertical.
