| **Ship claim** (new) | One per ship, held on the subject `Entity`: a `Profile` (a hull's `HullItemData`, or a `BackgroundKind`) and an optional shown `Faction`. Namespace: the ship. Absent means the truth shows. Injective by construction (one slot per ship). | Written each tick its EW behaviour runs and is under its rated temperature; absent the tick it stops (switched off, too hot, destroyed, unpowered). Never stored, never replayed. | The ship's one active masquerade or blend behaviour. If two are fitted, the first in equipment order that runs (default; a fitting rule may forbid two). Forbidden: any other entity, presenters, the AI of other ships, the observer. |
| **Item claim** (new) | `(subject, item)`, carried inside the act: a `Claimed` class on `Signature` and on `ActiveEmission` and `PaintWarning`'s source. Defaults to `item.Data`. | Exists as long as the signature or emission it rides (one tick for emissions; until the source's next write for light). | The subject's EW behaviour sets the item's claim; `SetSignature` and `Emit` stamp it, so the one writer of light and emission stays the one writer of what they claim. Forbidden: the emitting behaviours choosing their own claim (a gun does not lie by itself). |
| **Channel suppression** (new) | `(ship, channel)` factor, 0..1, on the subject. | Set each tick a suppressor runs; 1 otherwise. Applied inside `SetSignature` to that channel's strength. | The ship's suppressor behaviour. Forbidden: weapons scaling their own flash; observers. |
| **Reveal** (changed) | Unchanged key `(observer, subject, true item)`; gains `Claimed`. | As today: entered by an act, replaced by the item's later act, ended on perceived destruction, departure or memory age, cleared by `Deactivate`. The claimed class is the latest act's. | `RecordReveal` only (callers `Sense`, `PublishInbox`). Readers that classify read `Claimed`; `Item` is read only by `IsRevealed` and the book's gates. |
| **Belief** (new) | `(observer, subject)` in the observer's book beside its reveals: believed `Profile`, believed `Faction` (ruling `ew-hostility-from-belief-ruled`: allies by datalink are truth; any other contact's allegiance is the claim's, unknown when none, background when blending), `SeenThrough`, time. | Created when the observer first identifies the subject or receives its claim; revised each `Sense` from the subject's current claim and the judge; `SeenThrough` set by an envelope break, an out-of-arc view or own illumination; ends with the contact (track lost and `BearingMemory` past), on departure, or on `Deactivate`. A new claim from a seen-through subject is ignored until the contact ends. | `Entity.Sense` through the one judge. Forbidden: EW gear, presenters, AI, allies, except that an illuminator's burn-through reaches its ping-return allies through `PublishInbox` (ruling `ew-seen-through-sharing-ruled`). |
| **Contact** (changed) | Derived `(observer, subject)`, never stored. Gains `Profile`, `SeenThrough` (and allegiance per `ew-hostility-from-belief-ruled`). | Derived on every read. | `Entity.ContactOf` only. |
| **Own illumination** (new, transient) | `(observer, subject)`, this tick: the power over range of the observer's own ping crossing or lock paint on the subject. | One tick: written in `Update`, read by `Sense`, cleared by `PublishInbox`, as `_emissions` is now. | The observer's own `Sensor` and `LockWeapon` write it on their own entity. Forbidden: the subject; other entities. |
| **EW gear stats** (new) | Fields on new `BehaviorData` types with append-only MessagePack keys: masquerade (bandwidth window, background kinds, arc, masking strength, heat per second, rated temperature), suppressor (channels, factor, heat per unit suppressed), deployer (body design, heat drawn, launch speed). | Catalog edits through AetherDb; resolved per item by the entity's stat owner (Cut 2). | The catalog. Forbidden: runtime writes. |
| **Background kind** (new) | Append-only enum (`Rock`, `Debris`, more by ruling) with an envelope per kind in `GameplaySettings`: plume ceiling, light relative to nearby chunks, the belt-proximity radius. | Static data. | `GameplaySettings`. Forbidden: per-zone overrides (default; revisit if a zone needs one). |
| **Emitter body** (new) | An `Entity` instanced from a catalog design, admitted through Zone's one admission (Zone.cs:208); it names its `Parent` (the deploying ship). Its claim defaults to its parent's profile. | Created by a deployer behaviour, carrying heat drawn from the parent's cells; lives on its own heat and fuel; removed through the zone's removal path (a `Departure`, so observers judge its end) when spent or destroyed. Not saved. | Its own behaviours write its signatures (its real heat is its signature); the deployer decides creation; the zone owns admission and removal. Forbidden: observers, the parent after release. |
| **Jammer** (new) | Gear `BehaviorData` (cone half-angle and facing, power, gain factor, heat per second, rated temperature) on a ship; its output is `(ship, cone, power)`, this tick. | Runs each tick under its rated temperature: adds heat to its own cell through `AddHeat`, emits a heard jamming emission through `Emit` (heard far: it reveals the user and invites home-on-jam), and its cone-and-power thins `Sensor.Gain` for other ships' active sensors inside the cone, the one gain term. Silent above rated temperature. Not saved. | The jammer's own behaviour owns the emission and the cone; `Sensor.Gain` only reads them, as it reads `Zone.Obscuration`. Forbidden: any other writer of the jamming term; observers; the jammer writing a sensor's state directly. |
| **Heat** (existing) | Per-cell `Temperature` on the hull grid. | Unchanged. | The thermal sim; EW behaviours are ordinary `AddHeat` writers. No new owner. |
Recommended defaults, not questions: the emitter body is a `Ship` from a catalog design rather than a new `Entity`
subclass (it reuses hull, thermal grid, radiators and thrusters; the two existing subclasses are `Ship` and
`OrbitalEntity`); thrust history is instantaneous; a seen-through verdict holds for the life of the contact;
background envelopes live in `GameplaySettings`.
## Probes run
| # | Question | Result |
|---|---|---|
| P1 | Does master hold reveals-replace-tiers? | No. Master `e89d38e9` holds emissions-heard (`3c628f54`); reveals-replace-tiers is 3 commits ahead on its branch (merge base `642a61eb`), replacing `IsRevealed`'s info tiers with `HasReveal` plus live gear. This doc reads that branch's `IsRevealed`. |
| P2 | Who writes light, emission and the book? | `SetSignature` (Entity.cs:98-103, refuses Emission), `Emit` (:901), `RecordReveal` (:922, callers `PublishInbox` :884 and `Sense` :996, :1007). One writer each, so a claim can ride them. |
| P3 | Does anything read `ContactOf` or `RevealsOf` outside Entity? | No product code; only `ContactRevealTests`. contact-hud r2 moves presenters onto them, so EW lands one read site after it. |
| P4 | Is allegiance of a tracked contact truth? | Yes: `EntityHostility[e] = IsHostileTo(e)` on zone entry (Entity.cs:266, :272), and track entry files the entity into `VisibleEnemies` or `VisibleFriendlies` by it (:313-330). Minion targets the first visible enemy (Agents/Minion.cs:14), TurretController the first visible enemy ship (:98), the HUD draws hostile indicators from `VisibleEnemies` (ActionGameManager.cs:1106). Blend cannot work while this stays truth. |
| P5 | Does FireControl read true positions? | Yes, 19 `.Position` reads (e.g. FireControl.cs:237, :257, :295). Consistent with `what-not-where`; a false position would need a second position owner. |
| P6 | What can be blended into? | Chunks are not entities (Zone.cs:453-527: `ChunkExists`, `ChunkVisibility`, `ChunkPose`); only `Ship` and `OrbitalEntity` are entities. Background must be a claimed kind judged against nearby chunk light. |
| P7 | What of the early tier exists? | `Thermotoggle`, `HeatStorage`, `VapourDump`, `Radiator` are behaviours now; `LaunchFlash` is written only by `InstantWeapon` (:280) and `ConstantWeapon` (:173); no suppressor, decoy, jammer or spoof exists. |
| P8 | Is heat a real cost? | Yes: per-cell `Temperature` and `ThermalMass` (Entity.cs:1165-1213); hull radiation is item-less Thermal from cell temperatures (:1849). An EW `AddHeat` is visible later as thermal with no new state. |
| P9 | Do seekers exist to fool? | No: `MunitionSeekerData` is data only (Behaviors/MunitionParts.cs:60-125); a missile in flight is a Unity `GuidedProjectile`. Seeker EW waits on missile-records. |
## Follow-ups this campaign takes
-`missile-decoys-signature`: answered by the emitter body plus `classify-from-belief`; point defence and the HUD
treat a decoy as what they believe it is. The Nebulous "turrets take decoys first" note is second-hand and
unconfirmed (R:106); no decoy-first rule.
-`cloud-vs-missiles-in-flight`: a pinning test in the seeker cut, riding missile-records' reading.
-`two-listener-fix`: stays in faction play (not EW).
## Prior art that shaped this
Nebulous: Fleet Command treats jamming as noise against radar with burn-through (R:100, R:102), track quality and
error per sensor (R:101), seekers fooled by decoys matching a ship's signature (R:105, R:106). Star Citizen's
design note has decoys that broadcast another ship's signature but cannot fake cross-section (R:119): a lie bounded
by an envelope, as here. Sea Power gives each seeker a chance to reject a false target and each decoy a tier that
works against it (R:115), the shape of masking strength against illumination. EVE and Starsector make EW an
aggregate lock or range penalty (R:109, R:111), which is the masking end the operator set aside. Real-world
vocabulary: deception jamming and DRFM change apparent range, velocity or angle (R:126, R:128), the false-position
family this target defers; burn-through range (R:127); a self-protecting jammer reveals itself to home-on-jam