{
  "title": "PointCast Moon and Sun: Public Content and Data Contracts",
  "version": "1.0",
  "preparedOn": "2026-10-06",
  "scope": "Original public science prose, public-data integration specifications, educational exercises and conceptual collectibles. No private user information. No live measurements are embedded as current display values.",
  "packages": {
    "moon": {
      "slug": "/moon",
      "title": "The Moon is a neighborhood laboratory",
      "dek": "A local observing habit, a global science story, and a better way to collect a moment.",
      "editorialStatus": "Publication-ready original feature; live integrations still require runtime validation.",
      "researchDate": "2026-10-06",
      "featureWordCount": 1101,
      "featureSections": [
        {
          "heading": "One small step outside",
          "body": "The most interesting Moon dashboard begins with a question you can answer from your own neighborhood: what can I notice tonight that I missed yesterday? In El Segundo, start from a safe public spot with a clear patch of sky. A notebook is enough. Record the time, sketch the bright shape, and write down anything blocking your view. A beautiful app can help you plan, but the observation belongs to you. This page pairs that small local ritual with a much larger story: a nearby world, a repeating geometry lesson, and a record of exploration that anyone can learn to read.",
          "sourceIds": []
        },
        {
          "heading": "The shape is a viewpoint",
          "body": "The familiar sequence from crescent to full Moon is sunlight and perspective. As the Moon travels around Earth, we see different portions of its sunlit hemisphere. First quarter looks like half a disk because “quarter” describes a stage in the cycle, not the visible bright fraction. Waxing means that fraction is growing; waning means it is shrinking. Earth's shadow explains a lunar eclipse, not the ordinary monthly phases. Follow the sequence for a few weeks and the Moon stops looking like a changing symbol. It becomes a moving, three-dimensional object whose light tells you where the Sun is.",
          "sourceIds": [
            "moon_phases"
          ]
        },
        {
          "heading": "A neighbor with room around it",
          "body": "The Moon's average distance is about 384,400 kilometers. That is an average, not tonight's measured separation: its orbit is not a perfect circle. Its radius is roughly 1,740 kilometers, small beside Earth but immense compared with any city. Using the average distance and the speed of light gives a one-way light-travel estimate of about 1.28 seconds. That calculation makes a surprisingly good dinner-table demonstration: count a beat before answering a question, then imagine every reply crossing empty space. The distance is close enough to feel like a destination and far enough to make ordinary communication a physical engineering problem.",
          "sourceIds": [
            "moon_facts"
          ]
        },
        {
          "heading": "Two clocks, one Moon",
          "body": "A lunar calendar is not simply a Gregorian month with a different illustration. The repeating phase cycle averages about 29.5 days. Astronomers call a complete cycle a lunation; lunar age is elapsed time since new Moon. Calendar boundaries can split that cycle anywhere, so a “Moon of October” is a human filing choice. On PointCast, every phase label should travel with a date and time standard. The same event may fall on different calendar dates for observers in different time zones. That is a useful lesson in reporting: two apparently conflicting dates can describe one event perfectly well.",
          "sourceIds": [
            "phase_definitions"
          ]
        },
        {
          "heading": "Read the shadows, not just the brightness",
          "body": "Full Moon is dramatic, but it is not the only rewarding time to look. The terminator, the boundary between lunar day and night, creates long shadows that make mountains and crater rims easier to distinguish. Try a sketch before taking a photograph; drawing forces you to decide what you actually see. Then compare the same feature on another night. A dark patch is not automatically a shadow, and a bright patch is not automatically a mountain. Treat the image as evidence to investigate. If using binoculars, choose a nighttime session well away from the Sun and keep the equipment supervised.",
          "sourceIds": [
            "moon_viewing"
          ]
        },
        {
          "heading": "The ocean connection needs a second dataset",
          "body": "Living near the coast makes the Moon feel practical. Lunar and solar gravity both contribute to tides; their alignment helps explain the larger tidal ranges associated with spring tides and smaller ranges around neap tides. But a phase badge cannot tell you when a particular beach will flood or whether conditions are safe. Local geography and other influences matter, and the timing need not match the phase exactly. Compare a lunar calendar with an appropriate NOAA tide station, keeping predictions separate from measured water levels. Let a surprising mismatch become a question, rather than forcing the ocean to fit a tidy graphic.",
          "sourceIds": [
            "noaa_tides",
            "noaa_local_tides"
          ]
        },
        {
          "heading": "A world with an archive",
          "body": "The Moon is also a place to investigate, not merely an object to admire. Lunar Reconnaissance Orbiter launched in 2009 and has built detailed records of terrain and the lunar environment. Its mission page was listed as active when this feature was researched on October 6, 2026. A good exploration habit is to follow a claim back to a mission page, instrument description, or dataset. “A landing site,” “evidence for a resource,” and “an operational settlement” are very different claims. Future plans should keep their dates, sources, and uncertainty attached; a compelling illustration is not proof that a mission has launched.",
          "sourceIds": [
            "lro",
            "lro_history"
          ]
        },
        {
          "heading": "What this dashboard can honestly tell you",
          "body": "Rise and set times are astronomical calculations for a place and date. They do not promise an unobstructed view through buildings, haze, or cloud. The U.S. Naval Observatory's daily service also supplies a phase and illuminated fraction calculated for local noon. That is a useful daily reference, not a live measurement from a camera in El Segundo. PointCast should say so beside the number. If a feed fails, the missing value should remain missing. An old value with its original date can still teach something; an old value dressed up as “now” teaches the wrong lesson.",
          "sourceIds": [
            "api_usno",
            "rise_definitions"
          ]
        },
        {
          "heading": "Turn a sighting into a tiny field report",
          "body": "A useful Moon report can fit on a postcard: date, local time, general neighborhood, equipment, a sketch or original image, and one question. Add the corresponding calculated phase as a separate field. Keep “I saw a pale halo” separate from “the halo was caused by ice crystals” unless you have evidence for the explanation. If the sky was covered, record that too. A cloudy night is a real observation of observing conditions, not a failed assignment. Shared reports should avoid home addresses and identifying details about children. A city-level location is enough for most learning and storytelling.",
          "sourceIds": []
        },
        {
          "heading": "Collect a moment, not a claim to the Moon",
          "body": "Imagine a free PointCast “Lunar Receipt”: an original geometric illustration built from the date, phase fraction, and the observer's own sketch. Its reverse carries the source links, time zone, calculation method, and a checksum of the report file. It can be downloaded, printed, or collected without a wallet. A future blockchain edition could anchor that same record, but a token would not prove the observation happened, confer lunar property, or guarantee value. NASA's media guidelines specifically discourage using its materials for NFTs. Keep collectible artwork original, preserve provenance, and leave any minting or payment as a separate, explicit decision.",
          "sourceIds": [
            "nasa_media"
          ]
        },
        {
          "heading": "A neighborhood observatory can be a habit",
          "body": "The best outcome is not a screen full of impressive decimals. It is noticing that your questions improve. Why was the Moon visible before dinner? Why did the same crater look flatter a week later? Why did your friend in another city write a different date beside the same full Moon? Make room for those questions in the UES learning sequence. Observe, compare, explain, and revise. Keep the first sketch, including its mistakes. A month later, that little archive will show something more personal than a generic sky chart: how your own attention learned to move with the Moon.",
          "sourceIds": []
        }
      ],
      "keyStats": [
        {
          "label": "Mean Earth–Moon distance",
          "value": 384400,
          "unit": "km",
          "definition": "Average center-to-center orbital distance; not the instantaneous distance.",
          "kind": "reference",
          "sourceIds": [
            "moon_numbers"
          ]
        },
        {
          "label": "Lunar equatorial radius",
          "value": 1737.5,
          "unit": "km",
          "definition": "Center to equator.",
          "kind": "reference",
          "sourceIds": [
            "moon_numbers"
          ]
        },
        {
          "label": "Lunar surface gravity",
          "value": 1.624,
          "unit": "m/s²",
          "definition": "Equatorial gravitational acceleration, approximately one-sixth of Earth’s.",
          "kind": "reference",
          "sourceIds": [
            "moon_numbers"
          ]
        },
        {
          "label": "Lunar surface area",
          "value": 37936694.79,
          "unit": "km²",
          "definition": "Reference total surface area; round to 37.9 million km² in the UI.",
          "kind": "reference",
          "sourceIds": [
            "moon_numbers"
          ]
        },
        {
          "label": "Mean phase cycle",
          "value": 29.5,
          "unit": "Earth days",
          "definition": "Approximate interval from one new Moon to the next; individual lunations vary.",
          "kind": "reference",
          "sourceIds": [
            "phase_definitions"
          ]
        },
        {
          "label": "Mean-distance one-way light time",
          "value": 1.28,
          "unit": "s",
          "definition": "Calculated: 384,400 km / 299,792.458 km/s; illustrative mean-distance result, not a current measurement.",
          "kind": "calculated_reference",
          "sourceIds": [
            "moon_facts"
          ]
        },
        {
          "label": "Illuminated fraction",
          "value": null,
          "unit": "% of apparent disk",
          "definition": "Directly sunlit fraction of the visible lunar disk; show its calculation instant.",
          "kind": "calculated_ephemeris",
          "sourceIds": [
            "api_usno"
          ]
        },
        {
          "label": "Moonrise / moonset",
          "value": null,
          "unit": "local date and time",
          "definition": "Calculated upper-limb horizon events; may be absent for a date.",
          "kind": "calculated_ephemeris",
          "sourceIds": [
            "rise_definitions"
          ]
        }
      ],
      "learningExercises": [
        {
          "title": "Make a phase model",
          "level": "UES: notice → model → explain",
          "durationMinutes": 20,
          "materials": "A diffuse household lamp, a ball, paper; never use the Sun as the light source.",
          "steps": [
            "Keep the lamp fixed and move the ball around an observer.",
            "Sketch the visible bright portion at four positions.",
            "Explain why first quarter shows about half of the visible disk."
          ],
          "deliverable": "Four labeled sketches and a two-sentence explanation.",
          "check": "The light source illuminates roughly half the sphere; the observer sees different fractions. Ordinary phases are not Earth’s shadow.",
          "sourceIds": [
            "moon_phases"
          ]
        },
        {
          "title": "Audit a Moon number",
          "level": "UES: data literacy",
          "durationMinutes": 15,
          "materials": "A PointCast data card and its source link.",
          "steps": [
            "Find the value, unit, place, effective time and retrieval time.",
            "Classify it as observation, calculation or forecast.",
            "Rewrite an ambiguous “Moon now” label into a precise caption."
          ],
          "deliverable": "An annotated five-field evidence card.",
          "check": "USNO daily illumination is calculated for local noon; retrieval time alone does not establish freshness.",
          "sourceIds": [
            "api_usno"
          ]
        },
        {
          "title": "Put space on a sidewalk",
          "level": "UES: scale and arithmetic",
          "durationMinutes": 20,
          "materials": "Paper, tape measure and a safe open space.",
          "steps": [
            "Make a 1 cm-radius paper Moon.",
            "Use 1,737.5 km radius and 384,400 km mean distance to calculate the model separation.",
            "Predict before measuring, then compare."
          ],
          "deliverable": "Scale diagram and unit conversion.",
          "check": "384,400 / 1,737.5 cm ≈ 221 cm center-to-center; about 2.21 m. Model distance is a mean.",
          "sourceIds": [
            "moon_numbers"
          ]
        }
      ],
      "practicalExplorations": [
        {
          "title": "Seven-night neighborhood log",
          "action": "Choose safe nighttime sessions; record general location, time, sketch, visibility, and one question. Keep missed or cloudy nights rather than filling them with invented observations.",
          "output": "An observation journal independent of the computed phase feed."
        },
        {
          "title": "Terminator detective",
          "action": "Use a published lunar map to choose one named feature. Compare your original nighttime sketches on two dates and note how the shadows differ.",
          "output": "A before-and-after evidence card.",
          "sourceIds": [
            "moon_viewing"
          ]
        },
        {
          "title": "Moon-and-tide comparison",
          "action": "Compare a month of calculated phases with an appropriate NOAA station’s tidal predictions. Label the station, datum and prediction status; do not use this exercise for beach-access decisions.",
          "output": "A chart and one example where local timing complicates the simple story.",
          "sourceIds": [
            "noaa_local_tides"
          ]
        }
      ],
      "collectibleConcepts": [
        {
          "title": "Lunar Receipt",
          "format": "Original SVG/PNG plus JSON report",
          "idea": "A phase silhouette, a general place label, observer sketch and source-backed calculation record.",
          "rights": "Use original graphics or creator-owned photography only; do not embed NASA images/logos in NFT material."
        },
        {
          "title": "Terminator Studies",
          "format": "A free, numbered personal collection",
          "idea": "Pair original drawings of one lunar feature across dates, making changing shadows the artwork.",
          "rights": "A number indicates collection order, not artificial scientific rarity or promised value."
        },
        {
          "title": "Lunation Notebook",
          "format": "Downloadable report with checksum",
          "idea": "Combine a month of observations, missing nights, method versions and sources in one reproducible archive.",
          "rights": "Checksum helps detect file changes; it does not establish truth or authorship by itself."
        }
      ],
      "reportContract": {
        "format": "pointcast-report.v1 JSON plus readable HTML/print view",
        "fields": [
          "reportId",
          "title",
          "topic",
          "createdAt UTC",
          "locationLabel",
          "coarseCoordinates",
          "displayTimezone",
          "observationTime or calculationValidTime",
          "dataKind",
          "metrics with units/status",
          "sourceURLs",
          "retrievalTimes",
          "methodVersions",
          "assumptions",
          "userOriginalNotes",
          "originalAssetCredits",
          "contentChecksum"
        ],
        "privacy": "Default to city-level place and no personal identity. Do not upload photographs, precise location, student identities or addresses automatically. Local export first.",
        "integrity": "Canonicalize JSON before SHA-256 hashing; record hash algorithm and serialization version. A hash verifies byte identity only, not scientific truth, originality or ownership.",
        "blockchainStatus": "Concept only. No wallet request, signing, minting, payment, token deployment or public upload. Any later mint must separately identify network, fees, permanent/public fields, rights, recipient and authorization. Keep downloadable non-blockchain report available.",
        "licensing": "Cite data sources. NASA imagery/media has specific conditions and NFT restrictions. NOAA/NWS information is generally public domain unless annotated; third-party content can differ. USNO allows embedding API outputs; no blanket license for every website image or almanac page was verified. Use original art; do not assert exclusive rights over government facts or common astronomical events."
      },
      "implementationContract": {
        "schemaVersion": "pointcast.celestial.v1",
        "locationDefault": {
          "label": "El Segundo, California",
          "latitude": 33.9192,
          "longitude": -118.4165,
          "coordinateMeaning": "Approximate city-center default chosen for this product, not a surveyed observation site.",
          "timezone": "America/Los_Angeles",
          "elevationAssumption": "Standard unobstructed level-horizon calculation; no rooftop or terrain correction.",
          "consent": "Do not request device location by default; allow manual city/coordinate choice. Never publish precise personal locations by default."
        },
        "recordSchema": {
          "metric": "stable string",
          "value": "number|string|null",
          "unit": "explicit string",
          "kind": [
            "reference",
            "observation",
            "observation_derived",
            "forecast",
            "calculated_ephemeris",
            "modeled_history",
            "scenario",
            "calculated_reference"
          ],
          "status": [
            "available",
            "stale",
            "unavailable",
            "not_applicable"
          ],
          "sourceUrl": "verified source endpoint/document",
          "sourceName": "string",
          "sourceRecordTime": "ISO 8601 or null",
          "validFrom": "ISO 8601 or null",
          "validTo": "ISO 8601 or null",
          "fetchedAt": "ISO 8601 UTC or null",
          "computedAt": "ISO 8601 UTC or null",
          "timezone": "IANA display zone",
          "methodVersion": "algorithm/API/model version or null",
          "quality": "source flags, unchanged",
          "reason": "machine-readable reason or null",
          "assumptions": "string array"
        },
        "principles": [
          "Kind and availability are independent: a stale forecast is still a forecast.",
          "Never substitute 0, random values or yesterday’s measurement for missing data.",
          "Use source/valid time to assess relevance; successful fetching does not imply current data.",
          "Do not hide timestamps in tooltips only. Show a short status label beside each metric.",
          "Preserve explicit nulls and source quality flags. Distinguish a legitimate absent rise/set from a transport failure.",
          "Label reference facts separately from dynamic values. Do not animate illustrative graphics as if they were measured telemetry.",
          "Store raw source snapshots only with retrieval time and method metadata. Never make a source look like it endorsed PointCast."
        ],
        "displayPrecision": {
          "riseSet": "Nearest minute; date and local zone required.",
          "illumination": "Whole percent unless the model accuracy justifies more.",
          "Kp": "At most two decimal places, retaining source numeric value internally.",
          "speed": "Whole km/s for the compact card.",
          "solarEnergy": "At most two decimals, with all model assumptions visible."
        },
        "networkPolicy": "Public GET only. No keys, sign-ups, wallet connection, mint transaction, personal-data upload or server changes in this research scope. Browser-origin CORS and schema acceptance tests are required before shipping.",
        "emptyState": "Science stays readable. Dynamic card shows “Data unavailable” with source and last attempted check; last-known data may appear only as a dated archival card.",
        "reviewedOn": "2026-10-06",
        "primaryDailyEndpoint": "https://aa.usno.navy.mil/api/rstt/oneday?date={YYYY-MM-DD}&coords={latitude},{longitude}&tz=-8&dst=true",
        "phaseEndpoint": "https://aa.usno.navy.mil/api/moon/phases/year?year={YYYY}",
        "apiMapping": {
          "dailyRoot": "properties.data",
          "dailyPhase": "curphase",
          "dailyIllumination": "fracillum; inspect fixture to determine percent-string parsing, validate 0–100 after normalization",
          "moonEvents": "moondata[] fields phen,time; map semantic event names, never array positions",
          "solarEvents": "sundata[] fields phen,time",
          "primaryPhases": "phasedata[] fields phase,year,month,day,time; documented Universal Time"
        },
        "localTimeRule": "For the El Segundo default use standard tz=-8 with dst=true, letting USNO apply its documented US DST rules. Do not also pass -7 with dst=true. Treat returned local dates/times with response DST metadata. For configurable global locations, resolve IANA rules and use a separately tested UTC-based strategy; do not apply US DST rules worldwide.",
        "illuminationLabel": "Calculated for 12:00 local time on {date}",
        "eventInterpretation": "Calculated events under USNO assumptions, not observed horizon crossings. A null/no-event condition is not 00:00. Fetch neighboring dates if needed for next-event logic.",
        "nextPhaseRule": "Use first primary-phase instant after the requested instant, after correct Universal Time conversion. Do not use closestphase as if it meant next phase.",
        "cache": "Proposed product policy: cache daily ephemeris by exact date, coordinates and time-zone configuration; revalidate once per day. Cache annual phase lists up to 30 days. Date-mismatched daily data is unavailable for today, with optional dated archive.",
        "fallback": "Use an existing, licensed and tested astronomy library only if already available in the app. Label output “Calculated estimate” with library/version, instant and assumptions. No unvalidated hand-rolled phase clock; no silent replacement of USNO data. If no validated fallback exists, leave values unavailable.",
        "acceptanceTests": [
          "Daily USNO fetch returns valid GeoJSON and no error field.",
          "Test ordinary date, both DST transitions, next event across midnight, and a date with no lunar rise/set.",
          "Cross-check phase/illumination and events against the USNO site for at least three known dates.",
          "A failed feed must not change unavailable values into zero or a fake live badge.",
          "Verify computed noon is America/Los_Angeles noon, not browser-local noon.",
          "Ensure on-demand reports include sources, data kind, valid date, time zone, method and status."
        ],
        "sourceIds": [
          "api_usno",
          "rise_definitions",
          "phase_definitions"
        ],
        "runtimeNotes": [
          "Both USNO one-day and phase API sample GETs returned HTTP 502 in the research environment. Documentation verified; dynamic output must stay unavailable unless app-side calls or a validated labeled calculation succeed."
        ]
      },
      "sourceLedger": {
        "api_usno": {
          "title": "Astronomical Applications API documentation",
          "publisher": "U.S. Naval Observatory",
          "url": "https://aa.usno.navy.mil/data/api.html",
          "supports": "Keyless calculated daily events, noon illumination, primary phase API and parameters.",
          "checkedOn": "2026-10-06",
          "sourceType": "primary",
          "rightsNote": "Facts may be cited. No asset permission inferred from a page link; inspect individual credits before reuse."
        },
        "lro": {
          "title": "Lunar Reconnaissance Orbiter",
          "publisher": "NASA Science",
          "url": "https://science.nasa.gov/mission/lro/",
          "supports": "Mission data and active status at research date.",
          "checkedOn": "2026-10-06",
          "sourceType": "primary",
          "rightsNote": "Facts may be cited. No asset permission inferred from a page link; inspect individual credits before reuse."
        },
        "lro_history": {
          "title": "About Lunar Reconnaissance Orbiter",
          "publisher": "NASA Science",
          "url": "https://science.nasa.gov/mission/lro/about/",
          "supports": "2009 launch and mapping mission.",
          "checkedOn": "2026-10-06",
          "sourceType": "primary",
          "rightsNote": "Facts may be cited. No asset permission inferred from a page link; inspect individual credits before reuse."
        },
        "moon_facts": {
          "title": "Moon facts",
          "publisher": "NASA Science",
          "url": "https://science.nasa.gov/moon/facts/",
          "supports": "Mean Earth–Moon distance; synchronous rotation; physical context.",
          "checkedOn": "2026-10-06",
          "sourceType": "primary",
          "rightsNote": "Facts may be cited. No asset permission inferred from a page link; inspect individual credits before reuse."
        },
        "moon_numbers": {
          "title": "Compare Earth and the Moon",
          "publisher": "NASA Science / JPL Solar System Dynamics",
          "url": "https://science.nasa.gov/moon/by-the-numbers/",
          "supports": "Lunar radius, gravity, mass, surface area and orbital distance.",
          "checkedOn": "2026-10-06",
          "sourceType": "primary",
          "rightsNote": "Facts may be cited. No asset permission inferred from a page link; inspect individual credits before reuse."
        },
        "moon_phases": {
          "title": "Moon phases",
          "publisher": "NASA Science",
          "url": "https://science.nasa.gov/moon/moon-phases/",
          "supports": "Changing view of illuminated hemisphere; phase sequence; daytime Moon and libration.",
          "checkedOn": "2026-10-06",
          "sourceType": "primary",
          "rightsNote": "Facts may be cited. No asset permission inferred from a page link; inspect individual credits before reuse."
        },
        "moon_viewing": {
          "title": "Moon viewing tips",
          "publisher": "NASA Science",
          "url": "https://science.nasa.gov/moon/viewing-tips/",
          "supports": "Terminator observing and binoculars.",
          "checkedOn": "2026-10-06",
          "sourceType": "primary",
          "rightsNote": "Facts may be cited. No asset permission inferred from a page link; inspect individual credits before reuse."
        },
        "nasa_media": {
          "title": "NASA Images and Media Usage Guidelines",
          "publisher": "NASA",
          "url": "https://www.nasa.gov/nasa-brand-center/images-and-media/",
          "supports": "Educational/editorial uses, third-party rights, branding, NFT and endorsement restrictions.",
          "checkedOn": "2026-10-06",
          "sourceType": "primary",
          "rightsNote": "Facts may be cited. No asset permission inferred from a page link; inspect individual credits before reuse."
        },
        "noaa_local_tides": {
          "title": "Tides",
          "publisher": "NOAA JetStream",
          "url": "https://www.noaa.gov/jetstream/ocean/tides",
          "supports": "Local influences shift timing relative to lunar phase.",
          "checkedOn": "2026-10-06",
          "sourceType": "primary",
          "rightsNote": "Facts may be cited. No asset permission inferred from a page link; inspect individual credits before reuse."
        },
        "noaa_tides": {
          "title": "Tidal variations: position and distance",
          "publisher": "NOAA Ocean Service",
          "url": "https://oceanservice.noaa.gov/education/tutorial_tides/tides06_variations.html",
          "supports": "Lunar and solar contributions to spring/neap tides.",
          "checkedOn": "2026-10-06",
          "sourceType": "primary",
          "rightsNote": "Facts may be cited. No asset permission inferred from a page link; inspect individual credits before reuse."
        },
        "nws_rights": {
          "title": "National Weather Service disclaimer",
          "publisher": "NOAA / National Weather Service",
          "url": "https://www.weather.gov/disclaimer",
          "supports": "Public-domain information unless annotated, attribution/official-material distinction and acceptable use.",
          "checkedOn": "2026-10-06",
          "sourceType": "primary",
          "rightsNote": "Facts may be cited. No asset permission inferred from a page link; inspect individual credits before reuse."
        },
        "phase_definitions": {
          "title": "Phases and percent illuminated",
          "publisher": "U.S. Naval Observatory",
          "url": "https://aa.usno.navy.mil/faq/moon_phases",
          "supports": "Lunation, phase definitions and lunar age.",
          "checkedOn": "2026-10-06",
          "sourceType": "primary",
          "rightsNote": "Facts may be cited. No asset permission inferred from a page link; inspect individual credits before reuse."
        },
        "rise_definitions": {
          "title": "Rise, set and twilight definitions",
          "publisher": "U.S. Naval Observatory",
          "url": "https://aa.usno.navy.mil/faq/RST_defs",
          "supports": "Level-horizon/refraction assumptions; missing rise-set cases; twilight.",
          "checkedOn": "2026-10-06",
          "sourceType": "primary",
          "rightsNote": "Facts may be cited. No asset permission inferred from a page link; inspect individual credits before reuse."
        }
      },
      "assetRule": "Default visuals are original CSS/SVG astronomy-inspired diagrams. Schematic artwork must say it is an illustration, not an observed image."
    },
    "sun": {
      "slug": "/sun",
      "title": "The Sun is a clock, a power source, and a restless star",
      "dek": "Follow daylight in El Segundo, understand solar energy, and read space weather without the hype.",
      "editorialStatus": "Publication-ready original feature; live integrations still require runtime validation.",
      "researchDate": "2026-10-06",
      "featureWordCount": 1094,
      "featureSections": [
        {
          "heading": "Our daily star, three different stories",
          "body": "In El Segundo, the Sun can organize a morning walk, a science lesson, and a conversation about energy before breakfast. Those are connected stories, but they need different evidence. A sunrise time describes geometry. A solar-panel estimate describes a system and its assumptions. A space-weather chart describes activity measured far beyond the neighborhood. PointCast brings them together without blending them into one mysterious “solar score.” Start with the practical question you want to answer: when will daylight begin, how might a panel perform, or what is our star doing? The right question tells you which number matters.",
          "sourceIds": []
        },
        {
          "heading": "A star in ordinary daylight",
          "body": "The Sun is roughly 1.4 million kilometers across and about 150 million kilometers from Earth. Its visible photosphere is around 5,500 degrees Celsius; the core reaches roughly 15 million degrees Celsius, where fusion powers its light and heat. The familiar disk is therefore not a solid surface you could stand on. Even rotation refuses to behave like a rigid ball: the equatorial region turns faster than the polar regions. These enormous numbers become more useful when paired with scale. Sunlight takes about eight minutes to reach Earth, so even the most immediate-looking sunshine has already completed a long journey.",
          "sourceIds": [
            "sun_facts"
          ]
        },
        {
          "heading": "Sunrise is a definition, not a weather promise",
          "body": "The everyday phrase “the Sun came up” hides a precise convention: sunrise refers to the Sun's upper edge appearing at a level horizon under assumed atmospheric conditions. Civil twilight begins earlier, when the Sun's center is six degrees below the horizon. Buildings, terrain, clouds, and refraction can change what someone actually sees. A dawn planner should therefore label its times as calculated and keep visibility separate. For El Segundo, show Pacific local time using America/Los_Angeles, including seasonal clock changes. The device's time zone should never silently move a California sunrise into the wrong date for a reader traveling elsewhere.",
          "sourceIds": [
            "rise_definitions"
          ]
        },
        {
          "heading": "Follow daylight through the year",
          "body": "A daylight strip is a small, useful visualization: dawn, sunrise, solar noon, sunset, and dusk laid across a local day. Compare it with the same date a month earlier. The movement is a chance to ask what the season is doing, rather than merely whether the weather feels warm. For a UES exercise, write a prediction first, then inspect the calculated times. Be careful around clock changes: subtract actual instants to measure duration instead of subtracting clock labels. A one-hour change on the clock is not a sudden one-hour jump in Earth's relationship with the Sun.",
          "sourceIds": []
        },
        {
          "heading": "Power and energy are different questions",
          "body": "A watt measures a rate. A watt-hour measures an amount accumulated over time. A hypothetical device drawing 100 watts for three hours uses 300 watt-hours, or 0.3 kilowatt-hours. That arithmetic is the foundation of a useful solar-energy page. A panel's nameplate rating does not mean it produces that power every hour of daylight. Orientation, shading, temperature, clouds, equipment, and losses matter. PointCast's simplest calculator should invite users to change assumptions and watch the result move. Label every result as a scenario, not a promise about a specific roof, bill, or installation.",
          "sourceIds": []
        },
        {
          "heading": "Historical sunlight is not a roof sensor",
          "body": "NASA POWER offers programmatic access to solar-radiation datasets, including daily surface shortwave energy. Those values can help compare seasons and places, but a gridded environmental product is not a meter attached to your panels. Its time standard also needs attention: local solar time is different from California civil time. PVWatts is a more specialized system-production model, with inputs for capacity, tilt, azimuth, and losses; its API requires a key. Neither model turns an assumed system into a measured one. A good energy report records the dataset, units, interval, model version, and all chosen inputs so another person can reproduce it.",
          "sourceIds": [
            "power_daily",
            "power_tutorial",
            "pvwatts"
          ]
        },
        {
          "heading": "A restless star does not follow a daily schedule",
          "body": "Sunspots provide one way to track the roughly eleven-year cycle of solar activity. The cycle is a broad pattern, not a timetable for tomorrow's eruption. A solar flare is an energetic burst associated with magnetic activity; a coronal mass ejection involves material and magnetic field moving into space. Those terms should not be used interchangeably, and a dramatic image alone does not establish an effect at Earth. Keep the page curious rather than alarmist. Ask what was measured, where the instrument was, when the signal was recorded, and whether the statement describes an observation, a model, or a forecast.",
          "sourceIds": [
            "solar_cycle",
            "flare"
          ]
        },
        {
          "heading": "What Kp says, and what it cannot say",
          "body": "The planetary Kp index summarizes disturbance in Earth's magnetic field. NOAA's estimated three-hour product is useful context for geomagnetic activity, but it is not a local aurora guarantee or an index of how sunny El Segundo feels. A recent observation and a forecast for a later interval deserve visibly different labels. Solar-wind speed and magnetic-field measurements add context, yet their spacecraft source and timestamps matter too. A successful download does not make an old measurement current. On this page, the time of the observation stays beside the value, and a delayed feed is allowed to look delayed.",
          "sourceIds": [
            "kp",
            "swpc_access"
          ]
        },
        {
          "heading": "Exploration makes the invisible tangible",
          "body": "The story is bigger than a chart. On December 24, 2024, Parker Solar Probe made a close approach about 3.8 million miles above the Sun's surface, an accomplished event worth separating from any future mission promise. Spacecraft can sample environments that people cannot safely visit, while instruments reveal wavelengths our eyes cannot see. Try treating an image like a reporter treats a quotation: retain its context. What instrument made it? Which wavelength or processing choice produced the colors? Is it a picture, a visualization, or an artist's concept? Those questions add wonder by making the evidence more specific.",
          "sourceIds": [
            "parker"
          ]
        },
        {
          "heading": "Make curiosity safe",
          "body": "Never look directly at the Sun without proper solar-viewing protection. Ordinary sunglasses are not enough. For direct unaided viewing, use undamaged viewers meeting ISO 12312-2 from a reliable supplier and follow their instructions. Never look through binoculars, a telescope, or a camera lens while wearing eclipse glasses; concentrated sunlight can destroy the filter and seriously injure your eyes. Optical equipment requires a suitable filter fitted securely at the Sun-facing end, with expert guidance. The easiest classroom choices are a pinhole projection viewed on a surface, ordinary shadow measurements, or published observatory images. Do not look through the pinhole.",
          "sourceIds": [
            "safety"
          ]
        },
        {
          "heading": "Save a solar day worth remembering",
          "body": "A PointCast “Daylight Print” could turn one day's calculated daylight into original bands of color, with a separate annotation for an actual observation or a clearly labeled energy scenario. A “Space Weather Receipt” could preserve the source timestamps behind a chart. Both should work as free downloads before anyone considers a blockchain. If a future edition is minted, its metadata should say exactly what is owned: a particular digital artwork or record, not sunlight, energy credits, a scientific endorsement, or an investment return. The most valuable collection may be the simplest: a year's worth of careful questions, honest measurements, and better explanations.",
          "sourceIds": []
        }
      ],
      "keyStats": [
        {
          "label": "Solar diameter",
          "value": 1400000,
          "unit": "km",
          "definition": "Rounded physical diameter.",
          "kind": "reference",
          "sourceIds": [
            "sun_facts"
          ]
        },
        {
          "label": "Mean Earth–Sun distance",
          "value": 150000000,
          "unit": "km",
          "definition": "Rounded mean distance, not a current range measurement.",
          "kind": "reference",
          "sourceIds": [
            "sun_facts"
          ]
        },
        {
          "label": "Photosphere temperature",
          "value": 5500,
          "unit": "°C",
          "definition": "Approximate visible-surface temperature; not core temperature.",
          "kind": "reference",
          "sourceIds": [
            "sun_facts"
          ]
        },
        {
          "label": "Core temperature",
          "value": 15000000,
          "unit": "°C",
          "definition": "Approximate central temperature.",
          "kind": "reference",
          "sourceIds": [
            "sun_facts"
          ]
        },
        {
          "label": "Solar activity cycle",
          "value": 11,
          "unit": "Earth years",
          "definition": "Approximate sunspot-cycle duration; not a fixed eruption schedule.",
          "kind": "reference",
          "sourceIds": [
            "solar_cycle"
          ]
        },
        {
          "label": "Sunrise / sunset",
          "value": null,
          "unit": "local date and time",
          "definition": "Calculated apparent upper-limb horizon events.",
          "kind": "calculated_ephemeris",
          "sourceIds": [
            "rise_definitions"
          ]
        },
        {
          "label": "Daylight duration",
          "value": null,
          "unit": "h min",
          "definition": "Elapsed time between calculated sunrise and sunset instants.",
          "kind": "calculated_ephemeris",
          "sourceIds": [
            "rise_definitions"
          ]
        },
        {
          "label": "Planetary Kp",
          "value": null,
          "unit": "dimensionless, 0–9",
          "definition": "Estimated planetary geomagnetic index for its three-hour interval; not a local aurora forecast.",
          "kind": "observation_derived",
          "sourceIds": [
            "kp"
          ]
        },
        {
          "label": "Solar-wind proton speed",
          "value": null,
          "unit": "km/s",
          "definition": "Spacecraft measurement; preserve source, quality and observation time.",
          "kind": "observation",
          "sourceIds": [
            "swpc_changes"
          ]
        },
        {
          "label": "Daily solar irradiation",
          "value": null,
          "unit": "read API parameter units",
          "definition": "Daily surface energy per area; preserve UTC or local-solar-time interval and modeled-data label.",
          "kind": "modeled_history",
          "sourceIds": [
            "power_daily"
          ]
        }
      ],
      "learningExercises": [
        {
          "title": "Keep a shadow clock",
          "level": "UES: measure → graph → explain",
          "durationMinutes": 30,
          "materials": "A fixed short upright object, chalk or paper, ruler; observe shadows only.",
          "steps": [
            "Mark the shadow tip at several recorded local times without looking at the Sun.",
            "Measure lengths and draw a graph.",
            "Compare the shortest observed shadow with calculated solar noon; note that sparse samples may miss the minimum."
          ],
          "deliverable": "Time-stamped shadow sketch and uncertainty note.",
          "check": "Clock noon and solar noon need not coincide. Do not claim an exact minimum from coarse sampling.",
          "sourceIds": [
            "rise_definitions",
            "safety"
          ]
        },
        {
          "title": "Watts into watt-hours",
          "level": "UES: energy arithmetic",
          "durationMinutes": 15,
          "materials": "Calculator and a hypothetical device rating.",
          "steps": [
            "Calculate 100 W × 3 h.",
            "Convert Wh to kWh.",
            "Test a scenario of 1 kW × 4 equivalent full-power hours × 0.8 overall factor."
          ],
          "deliverable": "Two calculations with units and assumptions.",
          "check": "300 Wh = 0.3 kWh; illustrative solar scenario = 3.2 kWh, not a roof forecast.",
          "sourceIds": []
        },
        {
          "title": "Observation or forecast?",
          "level": "UES: science reporting",
          "durationMinutes": 20,
          "materials": "An archived NOAA observation and a forecast with valid intervals.",
          "steps": [
            "Sort each record by issue time, valid time and data kind.",
            "Compare the forecast with a later observation for the same interval.",
            "Describe the difference without declaring the entire forecast system right or wrong."
          ],
          "deliverable": "A short forecast-verification paragraph.",
          "check": "Compare like intervals and units; retain revisions and unavailable data.",
          "sourceIds": [
            "kp",
            "swpc_access"
          ]
        }
      ],
      "practicalExplorations": [
        {
          "title": "A month of daylight",
          "action": "Compare calculated sunrise, sunset and daylight duration for four weekly dates at the same El Segundo coordinates. Keep America/Los_Angeles displayed.",
          "output": "A local daylight mini-almanac."
        },
        {
          "title": "Build a transparent energy scenario",
          "action": "Choose hypothetical capacity, equivalent full-power hours and losses. Show every input; compare the result with an alternate assumption rather than claiming a measured output.",
          "output": "A reproducible scenario card with kWh units."
        },
        {
          "title": "Follow one space-weather interval",
          "action": "Save a NOAA Kp forecast, then compare the later estimated observation for that same three-hour window. Include both timestamps and any gaps.",
          "output": "A small forecast-verification report, without an aurora guarantee.",
          "sourceIds": [
            "kp"
          ]
        }
      ],
      "collectibleConcepts": [
        {
          "title": "Daylight Print",
          "format": "Original generative SVG plus calculation metadata",
          "idea": "Color bands encode calculated daylight duration, with location/date/time-zone printed on the reverse.",
          "rights": "No Sun ownership, energy-credit claim, or NASA endorsement."
        },
        {
          "title": "Space Weather Receipt",
          "format": "Timestamped report and original chart",
          "idea": "Archive one interval with observation/forecast separation and source timestamps.",
          "rights": "Make revision history visible; no investment or aurora guarantee."
        },
        {
          "title": "Solar Scenario Edition",
          "format": "Original poster with transparent inputs",
          "idea": "A hypothetical energy calculation visualized as a clearly labeled educational edition.",
          "rights": "Never sell a model estimate as verified generation or carbon reduction."
        }
      ],
      "reportContract": {
        "format": "pointcast-report.v1 JSON plus readable HTML/print view",
        "fields": [
          "reportId",
          "title",
          "topic",
          "createdAt UTC",
          "locationLabel",
          "coarseCoordinates",
          "displayTimezone",
          "observationTime or calculationValidTime",
          "dataKind",
          "metrics with units/status",
          "sourceURLs",
          "retrievalTimes",
          "methodVersions",
          "assumptions",
          "userOriginalNotes",
          "originalAssetCredits",
          "contentChecksum"
        ],
        "privacy": "Default to city-level place and no personal identity. Do not upload photographs, precise location, student identities or addresses automatically. Local export first.",
        "integrity": "Canonicalize JSON before SHA-256 hashing; record hash algorithm and serialization version. A hash verifies byte identity only, not scientific truth, originality or ownership.",
        "blockchainStatus": "Concept only. No wallet request, signing, minting, payment, token deployment or public upload. Any later mint must separately identify network, fees, permanent/public fields, rights, recipient and authorization. Keep downloadable non-blockchain report available.",
        "licensing": "Cite data sources. NASA imagery/media has specific conditions and NFT restrictions. NOAA/NWS information is generally public domain unless annotated; third-party content can differ. USNO allows embedding API outputs; no blanket license for every website image or almanac page was verified. Use original art; do not assert exclusive rights over government facts or common astronomical events."
      },
      "implementationContract": {
        "schemaVersion": "pointcast.celestial.v1",
        "locationDefault": {
          "label": "El Segundo, California",
          "latitude": 33.9192,
          "longitude": -118.4165,
          "coordinateMeaning": "Approximate city-center default chosen for this product, not a surveyed observation site.",
          "timezone": "America/Los_Angeles",
          "elevationAssumption": "Standard unobstructed level-horizon calculation; no rooftop or terrain correction.",
          "consent": "Do not request device location by default; allow manual city/coordinate choice. Never publish precise personal locations by default."
        },
        "recordSchema": {
          "metric": "stable string",
          "value": "number|string|null",
          "unit": "explicit string",
          "kind": [
            "reference",
            "observation",
            "observation_derived",
            "forecast",
            "calculated_ephemeris",
            "modeled_history",
            "scenario",
            "calculated_reference"
          ],
          "status": [
            "available",
            "stale",
            "unavailable",
            "not_applicable"
          ],
          "sourceUrl": "verified source endpoint/document",
          "sourceName": "string",
          "sourceRecordTime": "ISO 8601 or null",
          "validFrom": "ISO 8601 or null",
          "validTo": "ISO 8601 or null",
          "fetchedAt": "ISO 8601 UTC or null",
          "computedAt": "ISO 8601 UTC or null",
          "timezone": "IANA display zone",
          "methodVersion": "algorithm/API/model version or null",
          "quality": "source flags, unchanged",
          "reason": "machine-readable reason or null",
          "assumptions": "string array"
        },
        "principles": [
          "Kind and availability are independent: a stale forecast is still a forecast.",
          "Never substitute 0, random values or yesterday’s measurement for missing data.",
          "Use source/valid time to assess relevance; successful fetching does not imply current data.",
          "Do not hide timestamps in tooltips only. Show a short status label beside each metric.",
          "Preserve explicit nulls and source quality flags. Distinguish a legitimate absent rise/set from a transport failure.",
          "Label reference facts separately from dynamic values. Do not animate illustrative graphics as if they were measured telemetry.",
          "Store raw source snapshots only with retrieval time and method metadata. Never make a source look like it endorsed PointCast."
        ],
        "displayPrecision": {
          "riseSet": "Nearest minute; date and local zone required.",
          "illumination": "Whole percent unless the model accuracy justifies more.",
          "Kp": "At most two decimal places, retaining source numeric value internally.",
          "speed": "Whole km/s for the compact card.",
          "solarEnergy": "At most two decimals, with all model assumptions visible."
        },
        "networkPolicy": "Public GET only. No keys, sign-ups, wallet connection, mint transaction, personal-data upload or server changes in this research scope. Browser-origin CORS and schema acceptance tests are required before shipping.",
        "emptyState": "Science stays readable. Dynamic card shows “Data unavailable” with source and last attempted check; last-known data may appear only as a dated archival card.",
        "reviewedOn": "2026-10-06",
        "ephemeris": "Use the Moon package’s USNO daily endpoint and timezone handling for sunrise, transit, sunset and civil twilight.",
        "daylight": "Compute sunsetInstant - sunriseInstant from correctly zoned instants. Never subtract only HH:mm strings. For polar/no-event cases use explicit not_applicable/continuous-daylight states from validated ephemeris, not invented 24 h or 0 h.",
        "endpoints": [
          {
            "id": "kp_observed",
            "url": "https://services.swpc.noaa.gov/products/noaa-planetary-k-index.json",
            "kind": "observation_derived",
            "mapping": "Object rows: time_tag, Kp, a_running, station_count. Preserve the three-hour interval.",
            "refreshPolicy": "Suggested: 5-minute cache; stale if interval end is more than 3 hours behind current UTC. This is a PointCast policy, not a NOAA guarantee."
          },
          {
            "id": "kp_forecast",
            "url": "https://services.swpc.noaa.gov/products/noaa-planetary-k-index-forecast.json",
            "kind": "forecast",
            "mapping": "Object rows: time_tag, kp, observed, noaa_scale. Keep source row status (observed/estimated/predicted); only predicted rows go in the forecast panel.",
            "refreshPolicy": "Suggested: 30-minute cache; if fetched snapshot is over 6 hours old, mark stale. If no trustworthy issue time is supplied, say “Retrieved at,” never invent “Issued at.” Past-valid forecast rows remain archival."
          },
          {
            "id": "solar_wind",
            "url": "https://services.swpc.noaa.gov/json/rtsw/rtsw_wind_1m.json",
            "kind": "observation",
            "mapping": "time_tag, source, active, proton_speed [km/s], proton_density [particles/cm³], proton_temperature [K], overall_quality and individual flags. Sort by time; select active=true records only. Do not assume last array row is latest.",
            "refreshPolicy": "Suggested: 60-second cache; stale if newest valid active sample exceeds 15 minutes. Keep source changes visible."
          },
          {
            "id": "solar_magnetic_field",
            "url": "https://services.swpc.noaa.gov/json/rtsw/rtsw_mag_1m.json",
            "kind": "observation",
            "mapping": "time_tag, source, active, bt and bz_gsm [nT], quality fields. Use active=true and matching time/source when relating to solar wind; do not average inactive satellite streams.",
            "refreshPolicy": "Suggested: 60-second cache; stale after 15 minutes. Null/sentinel or unsupported quality flags become unavailable, not calm conditions."
          },
          {
            "id": "solar_energy_history",
            "url": "https://power.larc.nasa.gov/api/temporal/daily/point?parameters=ALLSKY_SFC_SW_DWN&community=RE&longitude=-118.4165&latitude=33.9192&start={YYYYMMDD}&end={YYYYMMDD}&format=JSON&time-standard=UTC",
            "kind": "modeled_history",
            "mapping": "properties.parameter.ALLSKY_SFC_SW_DWN by YYYYMMDD; read parameter units and header fill_value/time standard from each response. Reject fill values; record grid/product provenance.",
            "refreshPolicy": "Suggested: fetch recent completed historical dates once daily. Missing recent days are unavailable, not zero. Historical observations remain historical; do not label them live."
          }
        ],
        "noaaSchemaMigration": "Accept current keyed object arrays first. If supporting legacy header matrices, map by header names. Never depend on numeric column offsets. Reject unknown schemas visibly. March 2026 notice replaces old plasma/mag endpoints; do not use /products/solar-wind/* legacy feeds.",
        "qualityPolicy": "Keep all upstream quality fields. Implement their documented interpretation before using flagged values. Source numeric fields may contain sentinel values; reject nonfinite, negative speed/density, out-of-range Kp and documented sentinels. Do not guess unknown quality semantics.",
        "energyScenario": {
          "formula": "energy_kWh = capacity_kW × equivalentFullPowerHours × overallFactor",
          "defaultLabel": "Illustrative scenario",
          "sampleInputs": {
            "capacity_kW": 1,
            "equivalentFullPowerHours": 4,
            "overallFactor": 0.8
          },
          "sampleOutput_kWh": 3.2,
          "warning": "Hypothetical arithmetic, not measured generation or a roof-specific forecast. Do not convert horizontal daily irradiation directly into tilted-array production without a model."
        },
        "deferred": "PVWatts v8 API integration needs an authorized API key and explicit system assumptions. No key provision or account creation performed. NOAA/GML legacy solar calculator is explicitly unsupported; do not market it as a maintained feed.",
        "acceptanceTests": [
          "Browser fetch, CORS and schema tests from final app origin.",
          "Sort solar-wind rows by UTC time and handle mixed active/inactive spacecraft.",
          "Test stale HTTP-200 response, null and sentinel values, empty arrays, source switches and schema mismatch.",
          "Observation and prediction lines use distinct legends, styles and valid-time ranges.",
          "Daylight duration remains continuous through civil-clock changes.",
          "Every energy chart displays W versus Wh/kWh correctly and names its modeled time standard."
        ],
        "sourceIds": [
          "api_usno",
          "swpc_changes",
          "kp",
          "swpc_access",
          "power_daily",
          "power_tutorial",
          "pvwatts",
          "noaa_calculator"
        ],
        "runtimeNotes": [
          "Research-side HTTP GET found CORS * on the four NOAA feeds. Actual app-origin behavior still must be tested.",
          "NASA POWER HTTP 200 had no CORS header and all tested daily values were fill values. Treat tested interval as unavailable.",
          "RTSW rows were not ordered chronologically; latest active sample requires sorting/filtering."
        ]
      },
      "sourceLedger": {
        "api_usno": {
          "title": "Astronomical Applications API documentation",
          "publisher": "U.S. Naval Observatory",
          "url": "https://aa.usno.navy.mil/data/api.html",
          "supports": "Keyless calculated daily events, noon illumination, primary phase API and parameters.",
          "checkedOn": "2026-10-06",
          "sourceType": "primary",
          "rightsNote": "Facts may be cited. No asset permission inferred from a page link; inspect individual credits before reuse."
        },
        "flare": {
          "title": "What is a solar flare?",
          "publisher": "NASA Science",
          "url": "https://science.nasa.gov/solar-system/what-is-a-solar-flare/",
          "supports": "Flare and magnetic activity context.",
          "checkedOn": "2026-10-06",
          "sourceType": "primary",
          "rightsNote": "Facts may be cited. No asset permission inferred from a page link; inspect individual credits before reuse."
        },
        "kp": {
          "title": "Planetary K-index",
          "publisher": "NOAA Space Weather Prediction Center",
          "url": "https://www.spaceweather.gov/products/planetary-k-index",
          "supports": "Estimated three-hour planetary geomagnetic index and limits.",
          "checkedOn": "2026-10-06",
          "sourceType": "primary",
          "rightsNote": "Facts may be cited. No asset permission inferred from a page link; inspect individual credits before reuse."
        },
        "nasa_media": {
          "title": "NASA Images and Media Usage Guidelines",
          "publisher": "NASA",
          "url": "https://www.nasa.gov/nasa-brand-center/images-and-media/",
          "supports": "Educational/editorial uses, third-party rights, branding, NFT and endorsement restrictions.",
          "checkedOn": "2026-10-06",
          "sourceType": "primary",
          "rightsNote": "Facts may be cited. No asset permission inferred from a page link; inspect individual credits before reuse."
        },
        "noaa_calculator": {
          "title": "Solar calculation details",
          "publisher": "NOAA Global Monitoring Laboratory",
          "url": "https://gml.noaa.gov/grad/solcalc/calcdetails.html",
          "supports": "Approximate Meeus-based geometry, atmospheric limitations, unsupported calculator notice.",
          "checkedOn": "2026-10-06",
          "sourceType": "primary",
          "rightsNote": "Facts may be cited. No asset permission inferred from a page link; inspect individual credits before reuse."
        },
        "nws_rights": {
          "title": "National Weather Service disclaimer",
          "publisher": "NOAA / National Weather Service",
          "url": "https://www.weather.gov/disclaimer",
          "supports": "Public-domain information unless annotated, attribution/official-material distinction and acceptable use.",
          "checkedOn": "2026-10-06",
          "sourceType": "primary",
          "rightsNote": "Facts may be cited. No asset permission inferred from a page link; inspect individual credits before reuse."
        },
        "parker": {
          "title": "Parker Solar Probe: humanity’s closest encounter with the Sun",
          "publisher": "NASA Scientific Visualization Studio",
          "url": "https://svs.gsfc.nasa.gov/14741",
          "supports": "Completed December 24, 2024 close approach, distance and speed.",
          "checkedOn": "2026-10-06",
          "sourceType": "primary",
          "rightsNote": "Facts may be cited. No asset permission inferred from a page link; inspect individual credits before reuse."
        },
        "power_daily": {
          "title": "POWER Daily API",
          "publisher": "NASA POWER",
          "url": "https://power.larc.nasa.gov/docs/services/api/temporal/daily/",
          "supports": "Daily data, UTC versus local solar time and API limits.",
          "checkedOn": "2026-10-06",
          "sourceType": "primary",
          "rightsNote": "Facts may be cited. No asset permission inferred from a page link; inspect individual credits before reuse."
        },
        "power_tutorial": {
          "title": "POWER API request tutorial",
          "publisher": "NASA POWER",
          "url": "https://power.larc.nasa.gov/docs/tutorials/service-data-request/api/",
          "supports": "Keyless solar-radiation query example.",
          "checkedOn": "2026-10-06",
          "sourceType": "primary",
          "rightsNote": "Facts may be cited. No asset permission inferred from a page link; inspect individual credits before reuse."
        },
        "pvwatts": {
          "title": "PVWatts V8 API",
          "publisher": "National Laboratory of the Rockies (formerly NREL)",
          "url": "https://developer.nlr.gov/docs/solar/pvwatts/v8/",
          "supports": "Required API key, PV model inputs, typical-weather estimates and output units.",
          "checkedOn": "2026-10-06",
          "sourceType": "primary",
          "rightsNote": "Facts may be cited. No asset permission inferred from a page link; inspect individual credits before reuse."
        },
        "rise_definitions": {
          "title": "Rise, set and twilight definitions",
          "publisher": "U.S. Naval Observatory",
          "url": "https://aa.usno.navy.mil/faq/RST_defs",
          "supports": "Level-horizon/refraction assumptions; missing rise-set cases; twilight.",
          "checkedOn": "2026-10-06",
          "sourceType": "primary",
          "rightsNote": "Facts may be cited. No asset permission inferred from a page link; inspect individual credits before reuse."
        },
        "safety": {
          "title": "Eclipse viewing safety",
          "publisher": "NASA Science",
          "url": "https://science.nasa.gov/eclipses/safety/",
          "supports": "Solar filters, indirect viewing and optical-device warning.",
          "checkedOn": "2026-10-06",
          "sourceType": "primary",
          "rightsNote": "Facts may be cited. No asset permission inferred from a page link; inspect individual credits before reuse."
        },
        "solar_cycle": {
          "title": "Track the solar cycle with sunspots",
          "publisher": "NASA Science",
          "url": "https://science.nasa.gov/sun/track-the-solar-cycle-with-sunspots/",
          "supports": "Sunspot counts and approximately 11-year activity cycle.",
          "checkedOn": "2026-10-06",
          "sourceType": "primary",
          "rightsNote": "Facts may be cited. No asset permission inferred from a page link; inspect individual credits before reuse."
        },
        "sun_facts": {
          "title": "Sun facts",
          "publisher": "NASA Science",
          "url": "https://science.nasa.gov/sun/facts/",
          "supports": "Size, temperature, distance, fusion, differential rotation.",
          "checkedOn": "2026-10-06",
          "sourceType": "primary",
          "rightsNote": "Facts may be cited. No asset permission inferred from a page link; inspect individual credits before reuse."
        },
        "swpc_access": {
          "title": "SWPC data access",
          "publisher": "NOAA Space Weather Prediction Center",
          "url": "https://www.spaceweather.gov/content/data-access",
          "supports": "Public NOAA data service.",
          "checkedOn": "2026-10-06",
          "sourceType": "primary",
          "rightsNote": "Facts may be cited. No asset permission inferred from a page link; inspect individual credits before reuse."
        },
        "swpc_changes": {
          "title": "Service Change Notice 26-21",
          "publisher": "NOAA National Weather Service",
          "url": "https://www.weather.gov/media/notification/pdf_2026/scn26-21_Data_Format_Changes_Impacting_SWPC_Products.pdf",
          "supports": "2026 object-array schema and RTSW endpoint/field changes.",
          "checkedOn": "2026-10-06",
          "sourceType": "primary",
          "rightsNote": "Facts may be cited. No asset permission inferred from a page link; inspect individual credits before reuse."
        }
      },
      "assetRule": "Default visuals are original CSS/SVG astronomy-inspired diagrams. Schematic artwork must say it is an illustration, not an observed image."
    }
  },
  "endpointVerification": [
    {
      "id": "kp",
      "url": "https://services.swpc.noaa.gov/products/noaa-planetary-k-index.json",
      "retrievedAt": "2026-10-06T07:34:35.591904+00:00",
      "httpStatus": 200,
      "cors": "*",
      "latestTimeTag": "2026-10-06T03:00:00"
    },
    {
      "id": "forecast",
      "url": "https://services.swpc.noaa.gov/products/noaa-planetary-k-index-forecast.json",
      "retrievedAt": "2026-10-06T07:34:35.592416+00:00",
      "httpStatus": 200,
      "cors": "*",
      "latestTimeTag": "2026-10-09T00:00:00"
    },
    {
      "id": "wind",
      "url": "https://services.swpc.noaa.gov/json/rtsw/rtsw_wind_1m.json",
      "retrievedAt": "2026-10-06T07:34:35.592858+00:00",
      "httpStatus": 200,
      "cors": "*",
      "latestTimeTag": "2026-10-06T07:29:04",
      "latestActiveTimeTag": "2026-10-06T07:28:00"
    },
    {
      "id": "mag",
      "url": "https://services.swpc.noaa.gov/json/rtsw/rtsw_mag_1m.json",
      "retrievedAt": "2026-10-06T07:34:35.593244+00:00",
      "httpStatus": 200,
      "cors": "*",
      "latestTimeTag": "2026-10-06T07:30:02",
      "latestActiveTimeTag": "2026-10-06T07:29:00"
    },
    {
      "id": "usno",
      "url": "https://aa.usno.navy.mil/api/rstt/oneday?date=2026-10-06&coords=33.9192%2C-118.4165&tz=-7&dst=false",
      "retrievedAt": "2026-10-06T07:34:35.594430+00:00",
      "error": "HTTP Error 502: Bad Gateway"
    },
    {
      "id": "phases",
      "url": "https://aa.usno.navy.mil/api/moon/phases/date?date=2026-10-01&nump=8",
      "retrievedAt": "2026-10-06T07:34:35.596130+00:00",
      "error": "HTTP Error 502: Bad Gateway"
    },
    {
      "id": "power",
      "url": "https://power.larc.nasa.gov/api/temporal/daily/point?parameters=ALLSKY_SFC_SW_DWN&community=RE&longitude=-118.4165&latitude=33.9192&start=20260901&end=20260907&format=JSON&time-standard=UTC",
      "retrievedAt": "2026-10-06T07:34:35.598723+00:00",
      "httpStatus": 200,
      "cors": null,
      "dataAvailability": "All seven requested September 2026 daily values were fill_value=-999.0. API reachable but no usable solar values returned for this interval; never render these as zero."
    }
  ],
  "implementationNote": "Use featureSections verbatim for full articles and sourceLedger to render citations. This file is a source package, not a deployed website. All monetary, wallet, signing and minting controls remain outside scope.",
  "builderCorrections": [
    "Added calculated_reference to the proposed research enum because the mean-distance light-time statistic uses that kind. The deployed on-demand report has its own schema at /observatory/report.schema.json."
  ]
}
