# STANDARD RULE — Fleet IPs Are Observed Values, Not Defining Values

**Filed:** Trip ◈ · ODT · 041626 evening
**Class:** Federal (system-agnostic principle) — applies to all crew, all stations, all docs
**Origin:** Dan DPS, 041626 ~20:00 PT, while unpacking TP-Link adapters and asking whether writing down IPs could fuck us the same way drive letters did.

---

## THE PATTERN

A station's **stable identity** is its name (ODT, GOG1, DPSR, etc.) plus its hardware, OS, physical location, and physical switch port. These do not change between sessions.

A station's **observed IPs** are session-scoped facts produced by an instrument (ipconfig, ping, arp, Tailscale status) at a moment in time. These DO change — between reboots, between interface additions, between network moves, between DHCP leases.

Writing observed values into documents as if they were defining values causes the same class of failure we solved for FAS drive letters:

| Hardcoded | Universal |
|---|---|
| `$fas2 = 'L:\'` | `Get-Volume \| Where FileSystemLabel -eq 'FAS2'` |
| `$gog1 = '10.0.0.3'` | `Resolve-DnsName gog1.local` / `tailscale ip -4 gog1` / fleet_scan lookup |
| `INVENTORY.md: GOG1 IP: 10.0.0.3` | `INVENTORY.md: GOG1 [identity only]` + fleet_scan output populates observations |

## THE CONCRETE FAILURE (041626 evening)

Three examples caught in a single session:

1. **ODT at 10.0.0.1 vs. R7900 at 10.0.0.1.** INVENTORY.md (040826 filing) claims R7900 is 10.0.0.1. Live `ipconfig` 041626 19:11 shows ODT's ethernet at 10.0.0.1. Same document has both — one is stale.
2. **GOG1 adds 10.0.0.54.** GOG1's new USB copper interface tonight has no anchor in INVENTORY.md, fleet_scan.ps1, or any standing doc. fleet_scan.ps1 would mark it "UNKNOWN."
3. **"CUBE when commissioned" memory entry.** Memory edit #13 (pre-041626) said "when CUBE is commissioned" — CUBE has been answering the fleet for days. Stale defining value.

## THE RULE

1. **INVENTORY.md STATIONS blocks carry stable identity only.** Name, hardware, OS, location, switch port, physical role. No IPs as properties of the station.
2. **IPs live in a separate, scan-populated block** — generated by `ENGINE/fleet_scan.ps1` (or equivalent on Unix), timestamped, with the instrument named. Overwrite on each scan. Never hand-edit.
3. **Scripts resolve stations by label, not literal.** Preferred order: Tailscale magic DNS -> mDNS (`gog1.local`) -> /etc/hosts / Windows hosts file -> fleet_scan output. Never `$gog1 = "10.0.0.3"` in code.
4. **Any observed IP cited in prose carries its instrument + time.** "GOG1 at 10.0.0.3 (ping from ODT, 041626 19:11)" — never "GOG1 is 10.0.0.3" as a standalone claim.
5. **fleet_scan.ps1 itself must be rewritten** to this pattern: station -> probes, not IP -> station. Filed as a NEARGULL.

## WHY THIS MATTERS

The Filing-Finding Gap (NA 014) in miniature: information correctly filed about the fleet, but filed as if it were permanent truth. The moment the network changes, the filing lies. The answer is not better filing — it's a live instrument that re-reads the network every session, and a catalog that says what it IS (hardware, role, location), not where it currently HAPPENS to be.

Same shape as:
- FAS2 label detection (RELAY/STANDARD_RULE_FAS2Detection_040326.md)
- Name the instrument rule (memory edit #24)
- Gate 0 compute-never-guess (run the command, don't remember the answer)

## RELATED RULES

- RELAY/STANDARD_RULE_FAS2Detection_040326.md (drive letters)
- Memory #24 (name the instrument)
- PI v5.3 "KEY PATHS — DETECT, NEVER HARDCODE" section
- Seven Architectural Principles #6: *"Detect drives by label, never by letter"* -> now extends to: *"Detect stations by label, never by IP"*

---

**Signed:** Trip ODT 041626 evening
