<!-- SOLIDABILITY-WORLD · part 50 -->
omplexity,
          lines: file.lines,
        });
      });

      // District hallways (connect district centers)
      if (dirIdx > 0) {
        const prev = layout.districts[dirIdx - 1];
        layout.hallways.push({
          from: { x: prev.position.x, z: prev.position.z },
          to: { x: districtX, z: districtZ },
        });
      }
    });

    return layout;
  }

  return { load, get, hasFullMap, toLayout };
})();


===== FILE: public/solidability-world/js/sw-onboard.js =====
// Solidability Universal Core — Onboarding Flow
// Guides new users: connect → authorize → analyze → generate → tour.
// Each user's world is isolated. Read-only by default.

const SWOnboard = (() => {
  let currentStep = 'welcome';

  const steps = [
    { id: 'welcome', title: 'Welcome to Solidability', desc: 'Your Website. Your AI. Your Authority.' },
    { id: 'connect', title: 'Connect Your Code', desc: 'Link your website or repository for read-only analysis.' },
    { id: 'authorize', title: 'Authorize Access', desc: 'Grant read-only permission. You control what we see.' },
    { id: 'analyze', title: 'Analyzing Architecture', desc: 'Mapping files, functions, routes, and dependencies.' },
    { id: 'generate', title: 'Building Your World', desc: 'Calculating geometry from structural complexity.' },
    { id: 'tour', title: 'Meet Your Software', desc: 'AI Drive will walk you through your world.' },
  ];

  function showOnboarding() {
    let panel = document.getElementById('sw-onboard');
    if (!panel) {
      panel = document.createElement('div');
      panel.id = 'sw-onboard';
      document.getElementById('app').appendChild(panel);
    }
    renderStep(panel);
    panel.classList.add('visible');
  }

  function renderStep(panel) {
    const step = steps.find(s => s.id === currentStep);
    const idx = steps.indexOf(step);

    let content = '';
    switch (currentStep) {
      case 'welcome':
        content = `
          <p>Solidability turns your codebase into an explorable 3D world.</p>
          <p>Walk through your architecture. Inspect real source code. Let AI Drive guide you.</p>
          <button class="onboard-btn primary" onclick="SWOnboard.next()">Begin →</button>
        `;
        break;

      case 'connect':
        content = `
          <p>How is your code hosted?</p>
          <div class="connect-options">
            <button class="onboard-btn" onclick="SWOnboard.selectSource('server')">
              🖥️ On this server
              <small>Analyze a directory on this machine</small>
            </button>
            <button class="onboard-btn" onclick="SWOnboard.selectSource('github')">
              📦 GitHub repository
              <small>Connect via GitHub (coming soon)</small>
            </button>
            <button class="onboard-btn" onclick="SWOnboard.selectSource('upload')">
              📤 Upload archive
              <small>Upload a .zip of your project</small>
            </button>
          </div>
          <button class="onboard-btn secondary" onclick="SWOnboard.back()">← Back</button>
        `;
        break;

      case 'authorize':
        content = `
          <div class="auth-scope">
            <h4>🔒 Read-Only Access</h4>
            <ul>
              <li>✓ Read source files and directory structure</li>
              <li>✓ Extract functions, routes, dependencies</li>
              <li>✗ Never modify your code</li>
              <li>✗ Never access secrets, keys, or credentials</li>
              <li>✗ Never deploy or execute changes</li>
            </ul>
            <p class="scope-note">Your world is isolated. No other user can see it.</p>
          </div>
          <div id="path-input-group" style="display:none;">
            <input type="text" id="source-path" placeholder="/path/to/your/project" />
          </div>
          <button class="onboard-btn primary" onclick="SWOnboard.authorize()">Authorize & Analyze →</button>
          <button class="onboard-btn secondary" onclick="SWOnboard.back()">← Back</button>
        `;
        break;

      case 'analyze':
        content = `
          <div class="progress">
            <div class="spinner"></div>
            <p id="analyze-status">Scanning your codebase...</p>
          </div>
        `;
        // Trigger analysis
        setTimeout(runAnalysis, 500);
        break;

      case 'generate':
        content = `
          <div class="progress">
            <div class="spinner"></div>
            <p id="generate-status">Calculating world geometry...</p>
          </div>
        `;
        setTimeout(runGeneration, 500);
        break;

      case 'tour':
        content = `
          <p>Your world is ready.</p>
          <p>AI Drive will now walk you through your software.</p>
          <button class="onboard-btn primary" onclick="SWOnboard.startTour()">Start Tour 🗺️</button>
          <button class="onboard-btn secondary" onclick="SWOnboard.finish()">Explore on my own</