<!-- SOLIDIVISM · part 32 -->
orization.

---

## SAFEGUARD 1: CAUSAL MECHANISM LIMITATIONS

### Principle
Controlled before-and-after evidence establishes correlation under specific conditions. It does not automatically establish a complete causal mechanism.

### Implementation

Every verified causal claim must include:

```javascript
{
  from: "solidivism:event:code.deploy-X:v1",
  to: "solidivism:event:observation-Y:v1",
  relation: "CAUSED",
  causalType: "verified",

  // REQUIRED: Test conditions
  testConditions: {
    environment: "test browser (headless Chromium, software rendering)",
    beforeState: "foundation.js?v=aaa (with labelMeshes bug)",
    afterState: "foundation.js?v=aab (labelMeshes declared)",
    changedVariables: ["labelMeshes declaration added"],
    unchangedVariables: ["Three.js version", "browser", "test procedure", "viewport"],
    timestamp: "2026-10-08T22:41:00Z"
  },

  // REQUIRED: Alternative explanations
  alternativeExplanations: [
    {
      hypothesis: "Browser cache expired between tests, loading fresh code for unrelated reason",
      plausibility: "low",
      whyRuledOut: "Cache-busting was already in place (?v=aaa to ?v=aab forces reload)",
      ruledOut: true
    },
    {
      hypothesis: "Test procedure differed between before/after",
      plausibility: "low",
      whyRuledOut: "Same task description, same wait time, same observer",
      ruledOut: true
    },
    {
      hypothesis: "Another concurrent change caused the fix",
      plausibility: "medium",
      whyRuledOut: "No — only labelMeshes change deployed between tests. Verified via deployment log.",
      ruledOut: true
    }
  ],

  // REQUIRED: Limitations
  limitations: [
    "Tested in headless browser only, not on King's iPhone",
    "Single trial, not repeated",
    "Mechanism (ReferenceError blocking execution) inferred from code inspection, not runtime stack trace",
    "Does not rule out additional latent bugs"
  ],

  // What WOULD strengthen the claim
  strongerEvidenceNeeded: [
    "Runtime console log showing ReferenceError before fix",
    "Repeat test on iPhone hardware",
    "Code-level assertion that addBuilding completes without throw"
  ],

  confidence: "high",  // Despite limitations, before/after with single variable change is strong
}
```

### Rule
No causal claim is marked "verified" without:
1. Documented test conditions (what changed, what didn't)
2. At least 2 alternative explanations considered
3. Explicit limitations listed
4. Stronger evidence identified (even if not yet obtained)

---

## SAFEGUARD 2: OBSERVER-INSTRUMENT-ENVIRONMENT SEPARATION

### Principle
Observers, instruments, environments, and observations are separate identifiable subjects. Do not assume a particular browser or GPU explains a difference without evidence.

### Entity Types (New)

```javascript
// OBSERVER: Who or what is observing
{
  id: "solidivism:observer:test-browser:v1",
  type: "OBSERVER",
  description: "Headless Chromium via browser task",
  capabilities: ["screenshot", "DOM inspection"],
  limitations: ["no GPU acceleration", "no touch input", "no user interaction beyond scripted"]
}

{
  id: "solidivism:observer:the-king-iphone:v1",
  type: "OBSERVER",
  description: "King's iPhone 17 Pro Max, Safari",
  capabilities: ["GPU rendering (Metal)", "touch input", "real user interaction"],
  limitations: ["screenshots only (no DOM)", "single viewport size"]
}

// INSTRUMENT: What tool is used to observe
{
  id: "solidivism:instrument:screenshot:v1",
  type: "INSTRUMENT",
  description: "PNG screenshot capture",
  fidelity: "Visual only; no depth, no interaction state",
  // An instrument is not the observer. Same observer can use different instruments.
}

// ENVIRONMENT: Conditions of observation
{
  id: "solidivism:environment:browser-test-20261008-2241:v1",
  type: "ENVIRONMENT",
  conditions: {
    network: "unknown (not measured)",
    cache: "unknown (version param ?v=aab suggests fresh)",
    gpu: "none (software rendering)",
    viewport: "unknown dimensions",
    timestamp: "2026-10-08T22:41:00Z"
  },
  // Unknown fields marked unknown, not assumed
}

// OBSERVATION: The recorded result (links all three)
{
  id: "solidivism:observation:buildings-visible-20261008-2241:v1",
  type: "OBSERVATION",
  observer: "solidivism:observer:test-browser:v1",
  instrument: "solidivism:instrument:screenshot:v1",
  environment: "solidivism:environment:browser-test-20261008-2241:v1",
  subject: "solidivism:building:forge:v3",
  result: "visible",
  // The observation is separate from the observer, instrument, and environment.
  // Disagreement between observations? Check if observer/instrument/environment differed.
}
```

### Anti-Assumption Rule

**Forbidden:** "The browser test showed X but the iPhone showed Y because the browser has no GPU."

**Required:** 
```javascript
{
  discrepancy: "Browser shows buildings; iPhone screenshot unclear",
  observerA: "solidivism:observer:test-browser:v1",
  