Source: https://guthlabs.ai/docs/instruments/astronomical-twilight-duration/

instrument / verified-with-binding-errata

# Astronomical Twilight Duration

The current ledger marks this instrument verified with errata that must be applied at binding time.

Status: **VERIFIED_WITH_ERRATA**Lifecycle: **verified-with-binding-errata**

## Inspectable records

[01**Overview**Purpose and lifecycle](<https://guthlabs.ai/docs/instruments/astronomical-twilight-duration/>)[02**Mechanism**Method and assumptions](<https://guthlabs.ai/docs/instruments/astronomical-twilight-duration/mechanism/>)[03**Implementation**Binding and validation](<https://guthlabs.ai/docs/instruments/astronomical-twilight-duration/implementation/>)[04**Qualification**Evidence and errata](<https://guthlabs.ai/docs/instruments/astronomical-twilight-duration/qualification/>)

## Ledger state

The current ledger marks this instrument verified with errata that must be applied at binding time.

**Area**: Earth & Space (astronomy, orbital mechanics, meteorology, geology, geodesy, oceanography)

**Tranche**: tranche-6

**Evidence ID**: t6-090

**Ledger rows**: 1

No ledger note is attached.

## Review findings

The four vectors are deterministic provisional checks for the standard geometric hour-angle method, not definitive checks of the unspecified lookup-table implementation. The instrument needs a named algorithm, explicit UTC/local-time behavior, longitude convention, atmospheric/elevation assumptions, and documented polar/no-crossing outputs before it can receive PASS.

### Formula and scope findings

- The specification names depression-angle thresholds but does not define the solar-position algorithm, so the result is not uniquely reproducible.

- The implementation must explicitly use solar zenith angles of 96° (civil), 102° (nautical), and 108° (astronomical), equivalent to solar-center altitudes of -6°, -12°, and -18°; whether atmospheric refraction and the solar disk are included is unspecified.

- The input date is insufficiently defined: a timezone, time scale, and timestamp/date convention are required. Longitude alone does not determine displayed local clock times.

- No behavior is specified for locations or dates where one or more twilight crossings do not occur, including polar day, polar night, and continuous twilight.

- The stated lookup-table engine is ambiguous because no table source, interpolation rule, or solar-position equations are supplied.

- The claimed approximately 1-minute accuracy cannot be verified without specifying the algorithm, reference ephemeris, refraction model, elevation, and validity range.

### Unit assumptions

- Latitude and longitude are assumed to be decimal degrees, with latitude positive north and longitude positive east.

- Depression angles are degrees below the ideal geometric horizon; zenith angles are 90° plus the depression angle.

- Test-vector times are UTC, at sea level, with longitude interpreted using the conventional east-positive sign.

- The provisional hand checks below use the idealized hour-angle model: solar declination is explicitly set to the stated value, equation of time is zero, and solar noon is 12:00 UTC minus longitude divided by 15° per hour.

- The provisional model ignores atmospheric refraction, observer elevation, solar-radius correction, and terrain obstruction.

## Boundary hardening

### Recorded hazards

- Missing timezone or explicit UTC output can shift every displayed time by hours.

- Longitude sign convention and degree-versus-radian handling must be validated; a 180° longitude is an especially important wraparound case.

- The hour-angle formula divides by cos(latitude)cos(declination); it becomes singular or numerically unstable near the poles and must use an explicit no-event/continuous-event policy.

- Each threshold requires checking whether the computed acos argument lies in [-1,1]. Outside that interval, the corresponding twilight event does not occur rather than producing NaN or a fabricated time.

- Near the poles and near threshold boundaries, floating-point rounding can incorrectly switch between an event and no event.

- Atmospheric refraction, elevation above sea level, solar radius, and terrain horizon can change event times by more than the claimed one-minute accuracy.

- Date handling must include leap years, UTC date boundaries, and equation-of-time/date conversion. A date without timezone and calendar specification is not sufficient.

- The honest label should say approximately one minute only after the exact solar-position algorithm and environmental assumptions are documented; otherwise the accuracy claim is unsupported.

## Errata and corrections

### Tranche errata

**civil/astronomical hour_angle_deg** · vector 3,4

98.503 / 115.921

98.5009 / 115.9136

micro acos slips at lat 45; nautical is exact

## Inspectable example

4 review vectors are recorded. One source-bound sample is shown below.

````
{
  "inputs": {
    "lat_deg": 0,
    "lon_deg": 0,
    "date": "idealized_equinox",
    "solar_declination_deg": 0,
    "timezone": "UTC",
    "model": "geometric hour-angle check"
  },
  "expected_outputs": {
    "civil": {
      "begin": "05:36:00 UTC",
      "end": "18:24:00 UTC",
      "hour_angle_deg": 96
    },
    "nautical": {
      "begin": "05:12:00 UTC",
      "end": "18:48:00 UTC",
      "hour_angle_deg": 102
    },
    "astronomical": {
      "begin": "04:48:00 UTC",
      "end": "19:12:00 UTC",
      "hour_angle_deg": 108
    }
  },
  "working": "For latitude 0° and declination 0°, sin(phi)sin(delta)=0 and cos(phi)cos(delta)=1, so cos(H)=cos(Z). Therefore H=Z. Civil: Z=90°+6°=96°; 96°/15=6.4 h=6 h 24 min, so 12:00-06:24=05:36 and 12:00+06:24=18:24. Nautical: Z=102°; 102/15=6.8 h=6 h 48 min, so 05:12 and 18:48. Astronomical: Z=108°; 108/15=7.2 h=7 h 12 min, so 04:48 and 19:12."
}
````

## Related workflows

No source-defined multi-instrument workflow membership is recorded.

## Sources and evidence

These pointers bind the page to evidence. They do not grant authority or collapse verification into deployment.

- `VERIFIED_LEDGER.json · VERIFIED_WITH_ERRATA`

- `evidence-tranche6/tranche6-results.json`
