{
  "schema": "noah-homepage-agent-interface/v2",
  "purpose": "The visible employer and education arc and physical camera state used by the homepage; the full source timeline remains available without a separate agent rendering or AI inference.",
  "resources": {
    "timeline": {
      "url": "/api/personal-timeline",
      "method": "GET",
      "order": "employers array, current first and birth last; retain source precision, unknown values and provenance"
    },
    "skyProvenance": "/celestial/fusion-v1/manifest.json",
    "spaces": {
      "url": "/space-map.json",
      "method": "GET",
      "order": "Personal Space, Spacetime, then FPV and Research/Intelligence/Systems; public navigation only"
    },
    "distanceStudies": {
      "url": "/design/orbits?distance=meo",
      "modes": [
        "leo",
        "meo",
        "geo",
        "cislunar"
      ],
      "scope": "Isolated fixed-lens design variants. Authored timeline height stays independent of the preview’s camera distance."
    }
  },
  "state": {
    "root": "#main-content",
    "timelineRevision": "data-timeline-revision",
    "activeCheckpointId": "data-active-checkpoint",
    "activeCheckpointIndex": "data-active-checkpoint-index",
    "progress": "data-timeline-progress (0 newest visible checkpoint, 1 earliest visible checkpoint)",
    "checkpoint": ".noah-chapter[data-checkpoint-id]",
    "activeCheckpoint": ".noah-chapter[data-active=\"true\"]",
    "camera": {
      "selector": ".noah-meridian-globe",
      "ready": "data-ready=true",
      "latitudeDegrees": "data-focus-latitude",
      "longitudeDegrees": "data-focus-longitude",
      "altitudeMeters": "data-observer-altitude-meters",
      "mode": "data-camera-mode",
      "focalLengthCssPixels": "data-focal-length-css-pixels",
      "horizontalFovDegrees": "data-horizontal-fov-degrees",
      "verticalFovDegrees": "data-vertical-fov-degrees",
      "observerLatitudeDegrees": "data-camera-latitude",
      "observerLongitudeDegrees": "data-camera-longitude"
    },
    "headingDegrees": ".noah-celestial-world[data-view-heading]",
    "skyUtc": "canvas[data-utc] (ISO8601 UTC, sampled once per second; read only when renderer is ready)",
    "cameraResolved": "data-camera-resolved on root",
    "authoredAltitudeMeters": "data-authored-altitude-meters on root; absent means unknown",
    "rendererStatus": ".noah-celestial-world[data-renderer] (loading, ready, or fallback)",
    "motion": {
      "selector": ".noah-celestial-world",
      "status": "data-motion-status",
      "reason": "data-motion-reason",
      "headingReference": "data-heading-reference",
      "lastValidReadingUtc": "data-motion-reading-utc; absent until valid pose",
      "viewRotation": "data-view-rotation; relative quaternion x,y,z,w maps view-local right/up/back into the initial camera frame"
    },
    "sun": {
      "selector": ".noah-celestial-world canvas",
      "utc": "data-utc",
      "directionEarthFixed": "data-sun-direction",
      "observerEarthRadii": "data-observer",
      "altitudeDegrees": "data-solar-altitude-degrees",
      "azimuthDegrees": "data-solar-azimuth-degrees",
      "lightingModel": "data-atmosphere-model"
    },
    "visibleCheckpointCount": "data-visible-checkpoint-count on root"
  },
  "controls": {
    "timeline": {
      "selector": "#personal-date",
      "type": "native range",
      "indexToValue": "Number(max) - checkpointIndex",
      "minimum": "earliest visible checkpoint (currently Rensselaer Polytechnic Institute)",
      "maximum": "newest visible checkpoint",
      "step": 1,
      "keyboard": "Home=newest visible checkpoint; End=earliest visible checkpoint; ArrowDown/Right=older; ArrowUp/Left=newer; PageDown/Up=three visible checkpoints",
      "completion": "Wait for data-active-checkpoint-index to equal the requested index, then read camera readiness and state. Normal scroll and button actions remain available."
    },
    "phoneMotion": {
      "entry": "dialog.noah-motion-entry (shown once on eligible touch devices; no motion access on load)",
      "enable": "#noah-motion-enable",
      "skip": "#noah-motion-skip; Escape also dismisses",
      "permissions": "Only the person can approve browser motion permission. Enable calls permission directly from their tap. No persistent motion/source controls remain."
    },
    "spaces": {
      "open": "button[aria-label=\"Choose space\"]",
      "dialog": "dialog.noah-space-dialog",
      "dismiss": "Escape or Close space chooser",
      "navigation": "Native links in public /space-map.json; the extra native-instruments link is only present for the iOS host flag."
    }
  },
  "cameraModel": {
    "projection": "shared rectilinear pinhole camera for Earth SVG and sky",
    "headingDegrees": 0,
    "maxHorizontalFieldOfViewDegrees": 90,
    "horizonCenterScreenFraction": 0.6666666666666666,
    "earthRadiusMeters": 6371000,
    "altitudeMeaning": "authored illustrative camera height, not measured personal elevation or an orbital trajectory",
    "zeroHeight": "exact coincident surface limit with a flat horizon",
    "maxLimbSagFractionOfHeight": 0.18,
    "headingPolicy": "Default north-facing camera. Active motion uses the complete relative view quaternion; numeric heading is its azimuth when defined."
  },
  "truthBoundaries": [
    "Timeline year is independent of the live sky UTC.",
    "City anchors are presentation coordinates; missing spreadsheet coordinates stay missing.",
    "Historical measured sky layers retain source footprints, wavelengths, timestamps and display processing in the provenance manifest.",
    "Machine consumers use existing public GET data and native controls; private refresh/authentication is unchanged.",
    "Camera position and height interpolate continuously between checkpoints; the active checkpoint is rounded independently. Read the rendered camera rather than assuming it equals the active record during scroll.",
    "Absent focus coordinates or authored height mean unresolved or unknown; do not treat a fallback camera as observed personal location.",
    "Phone motion rotates the view in yaw, pitch and roll about the fixed timeline observer. It is not a measured true-north compass, GPS, positional tracking or a navigation solution.",
    "The first valid phone pose establishes relative zero. Solar epoch and Earth-fixed direction stay independent of phone motion. No user location is requested."
  ],
  "phoneMotion": {
    "default": "off; authored north-facing camera; eligible touch devices receive a transient entry prompt unless reduced motion is requested",
    "activation": "A temporary on-load entry offers Enable motion, which requests browser access directly from the person’s tap. Continue without keeps the static view.",
    "heading": "W3C device orientation with screen-angle compensation; first valid pose establishes the initial camera frame. Relative quaternion rotation preserves yaw, pitch and roll without an upright-only restriction.",
    "rateLimitHz": 20,
    "filterTimeConstantMilliseconds": 90,
    "reducedMotion": "direct sample steps without generated interpolation",
    "position": "Timeline location and authored altitude retained. No GPS, user location, camera or accelerometer-derived translation.",
    "privacy": "page memory only; no sensor recording, persistence or transmission",
    "lifecycle": "Unmount and hidden tab detach readings; malformed readings hold the last view; resume rebases; missing-data timeout releases listeners. No persistent overlay.",
    "physicalDeviceAcceptance": "requires actual phone/Safari check; virtual-sensor tests are separate",
    "inactivity": "Orientation events may fire only on change. A quiet held pose is retained; lastReadingUtc is the last valid delivered sample, not a freshness guarantee.",
    "translation": "Stable positional 6DOF needs tracked positioning; browser IMU orientation is used without invented translation."
  },
  "presentation": {
    "selection": "Filter the source employers array to records with a nonblank name or role, preserving source order. Rendered checkpoint IDs identify source records.",
    "rawSource": "The full source records, including location-only milestones, are retained at /api/personal-timeline.",
    "camera": "Location and authored height follow the same visible employer/education arc; no source height or geographic record is rewritten.",
    "endpoint": "Currently RPI in Troy at its source-authored 100 m camera height. Removing location-only milestones from the display does not imply surface height."
  }
}
