Files
weatherreporter/docs/troubleshooting.md

10 KiB

Weatherreporter Troubleshooting

This guide lists recurring failures with likely causes, diagnostics, and safe fixes. See CLI reference, Configuration reference, and Operations guide for normal usage.

weather_api.base_url is required

Symptom: a generation command fails before fetching weather data.

Likely cause: no Weather API base URL is configured.

Diagnostic:

weatherreporter generate daily --config ./config.yml --date 2026-05-29

Safe fix: add weather_api.base_url to the config file, or pass the intended config path with --config.

Relevant docs: Configuration reference.

weather_api.base_url must be an absolute URL

Symptom: config loading fails with a base URL validation error.

Likely cause: weather_api.base_url is missing a scheme or host.

Diagnostic: inspect the configured value in the file passed to --config.

Safe fix: use an absolute URL such as https://weather.api.example.com/.

Relevant docs: Configuration reference.

Invalid Timezone

Symptom: config loading fails with weather_api.timezone context, or a CLI timezone override fails.

Likely cause: weather_api.timezone or --tz is not recognized.

Diagnostic:

weatherreporter generate daily --tz America/Chicago --date 2026-05-29

Safe fix: use an accepted timezone value, such as an IANA timezone name, Chicago, Stl, a US timezone abbreviation, or a UTC offset.

Relevant docs: Configuration reference.

Storm Command Rejects Time Bounds

Symptom: generate storm fails with requires --start, requires --end, or requires --end after --start.

Likely cause: the manual event window is missing or invalid.

Diagnostic:

weatherreporter generate storm --start 2026-05-29T18:00 --end 2026-05-30T06:00

Safe fix: provide both bounds. Use YYYY-MM-DDTHH:MM in the configured timezone, or RFC3339 timestamps with explicit offsets.

Relevant docs: CLI reference.

Weather API Fetch Fails

Symptom: generation fails with fetch /..., an HTTP status, or request context.

Likely cause: the configured Weather API endpoint is unreachable, returned a non-2xx response, or returned an invalid response envelope.

Diagnostic:

weatherreporter generate daily --config ./config.yml --date 2026-05-29

Safe fix: verify weather_api.base_url, network access, and the Weather API service response. The adapter fetches /observations, /conditions/current, /forecast/hourly, /forecast/narrative, /alerts/active, and /discussion.

Relevant docs: Configuration reference.

Hourly Forecast Is Missing

Symptom: generation fails with hourly forecast context, such as missing hourly data or an hourly forecast containing no periods.

Likely cause: hourly forecast data is required for generated reports.

Diagnostic: check the Weather API response for /forecast/hourly.

Safe fix: restore hourly forecast data at the Weather API. Missing-source policy cannot make hourly optional.

Relevant docs: Configuration reference, Operations guide.

Source Warnings Appear

Symptom: generation succeeds, but metadata or inspect sources shows source warnings.

Likely cause: an optional source was missing or malformed under a warning missing-source policy.

Diagnostic:

weatherreporter inspect sources RUN_ID
weatherreporter inspect metadata RUN_ID

Safe fix: inspect the warning source, code, message, and endpoint. Fix the upstream optional source, or intentionally change the relevant missing_source policy.

Relevant docs: Configuration reference, Operations guide.

scriptorium Is Not Found Or Cannot Start

Symptom: generation fails with run scriptorium render or run scriptorium and an executable or OS error.

Likely cause: the configured Scriptorium binary is unavailable or not executable.

Diagnostic: check scriptorium.binary in config and run the same binary outside weatherreporter.

Safe fix: install Scriptorium, update scriptorium.binary, or fix executable permissions.

Relevant docs: Configuration reference, Scriptorium integration.

Render Preflight Fails

Symptom: generation fails with scriptorium render exited with code ....

Likely cause: Scriptorium rejected the prompt, config, profile, or data_package input before report generation.

Diagnostic:

weatherreporter inspect metadata RUN_ID
weatherreporter inspect data-package RUN_ID

Then read the preflight path from metadata. It contains captured stdout, stderr, exit code, and command.

Safe fix: fix the Scriptorium configuration, prompt ID, profile, or data package input indicated by stderr.

Relevant docs: Operations guide, Scriptorium integration.

Scriptorium Run Fails

Symptom: generation fails with scriptorium run exited with code ....

Likely cause: Scriptorium failed during report generation or validation.

Diagnostic:

weatherreporter inspect metadata RUN_ID
weatherreporter inspect data-package RUN_ID

If metadata includes a rendered report path, inspect that report as well. A nonzero run can still leave a managed report artifact.

Safe fix: use the captured stderr and data package to fix the Scriptorium prompt, profile, model configuration, or validation issue.

Relevant docs: Operations guide, Scriptorium integration.

Batch Command Returns Nonzero

Symptom: run morning or run evening returns nonzero.

Likely cause: at least one report in the batch failed.

Diagnostic: inspect stdout for the JSON summary and stderr for compact status lines.

Safe fix: use the failed report's artifact paths from the summary, then inspect metadata, sources, briefing, and data package for that RunID.

Relevant docs: CLI reference, Operations guide.

Invalid Secrets Directory

Symptom: config loading fails with read secrets directory, secret file, or environment variable name context.

Likely cause: secrets.directory points to a missing directory or contains an invalid entry. Secret entries must be regular files directly under the configured directory, and file basenames must match [A-Za-z_][A-Za-z0-9_]*.

Diagnostic: list the configured directory and inspect entry names and file types. Do not print secret file contents.

Safe fix: create the directory, remove subdirectories or symlinks, fix invalid filenames, and ensure the weatherreporter process can read each secret file.

Relevant docs: Configuration reference.

Distributor Token Is Missing

Symptom: notification fails with a message that the distributor token environment variable is not set.

Likely cause: notify.distributor.enabled is true, but the environment variable named by notify.distributor.token_env was not populated directly or through secrets.directory.

Diagnostic: check notify.distributor.token_env, then verify a matching secret file exists under secrets.directory or that the process environment includes the variable. Do not print the token value.

Safe fix: create a readable secret file whose basename matches token_env, or set the environment variable through the service manager.

Relevant docs: Configuration reference, Operations guide.

Distributor Upload Conflict

Symptom: notification fails with idempotency conflict context.

Likely cause: the same idempotency key was reused for different bundle content. By default the key derives from bundle ID, which includes location ID, report ID, and RunID.

Diagnostic: inspect the failed batch JSON or stderr line for bundle and idempotency context. Compare the configured templates with the report RunID and report path.

Safe fix: keep idempotency templates stable for retries of the same generated report, but do not reuse the same rendered key for different generated report content.

Relevant docs: Operations guide, Distributor adapter internals.

Distributor Upload Rejected

Symptom: notification fails with distributor upload rejection, HTTP status, or bundle validation context.

Likely cause: the distributor endpoint rejected the token, bundle ID, idempotency key, source file, or bundle path.

Diagnostic: inspect stdout JSON or stderr status lines for notificationError. Confirm notify.distributor.endpoint, notify.distributor.report_path_template, and token configuration. Token values are redacted from weatherreporter errors.

Safe fix: fix the endpoint, token, templates, or distributor-side upload configuration. The weatherreporter upload source is the managed Markdown report, not --out or --out-dir copies.

Relevant docs: Configuration reference, Operations guide, Distributor adapter internals.

Distributor Unavailable

Symptom: notification fails with network, timeout, or service unavailable context.

Likely cause: the configured distributor endpoint is unreachable, slow, or temporarily unavailable.

Diagnostic: check network access from the weatherreporter host to notify.distributor.endpoint. For batch runs, inspect which reports have notificationStatus: "failed".

Safe fix: restore distributor service availability and rerun the affected report or batch. Stable idempotency keys make retrying the same generated report safe unless the distributor reports a conflict.

Relevant docs: Operations guide.

Unknown RunID

Symptom: an inspect command fails with metadata for run id ... was not found.

Likely cause: the RunID is mistyped or the command is reading a different workspace.

Diagnostic:

weatherreporter inspect reports --config ./config.yml --limit 20

Safe fix: copy a RunID from inspect reports, or use the same --config and workspace that generated the report.

Relevant docs: Operations guide.

Workspace Path Error

Symptom: startup or inspection fails with workspace path validation or filesystem read/write context.

Likely cause: a workspace subdirectory is absolute, escapes workspace.root, or the process cannot read or write the configured path.

Diagnostic: review workspace.root, workspace.snapshots_dir, workspace.reports_dir, workspace.data_packages_dir, and workspace.preflight_dir.

Safe fix: keep workspace subdirectories relative to workspace.root, and grant the process appropriate filesystem permissions.

Relevant docs: Configuration reference, Operations guide.