opencode-skills-collection 4.0.67 → 4.0.68
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundled-skills/.antigravity-install-manifest.json +16 -1
- package/bundled-skills/anti-slop-design/SKILL.md +393 -0
- package/bundled-skills/antigravity-maintainer-batch-release/SKILL.md +1 -0
- package/bundled-skills/artifact-yylo/SKILL.md +122 -0
- package/bundled-skills/google-no-code/SKILL.md +136 -0
- package/bundled-skills/idea-evaluator/SKILL.md +75 -0
- package/bundled-skills/idea-evaluator/idea-evaluator-con/SKILL.md +64 -0
- package/bundled-skills/idea-evaluator/idea-evaluator-pro/SKILL.md +64 -0
- package/bundled-skills/ledger-tasks-yylo/SKILL.md +219 -0
- package/bundled-skills/loki-mode/examples/todo-app-generated/backend/package-lock.json +4 -4
- package/bundled-skills/loki-mode/examples/todo-app-generated/backend/package.json +1 -1
- package/bundled-skills/plan-ledger-tasks-yylo/SKILL.md +52 -0
- package/bundled-skills/ralph-loop-yylo/SKILL.md +55 -0
- package/bundled-skills/ralph-loop-yylo/references/first_check.md +18 -0
- package/bundled-skills/ralph-loop-yylo/references/implement.md +60 -0
- package/bundled-skills/resumable-implementation-contracts/SKILL.md +254 -0
- package/bundled-skills/understand-project-yylo/SKILL.md +62 -0
- package/bundled-skills/weather-model-data-fetching/SKILL.md +277 -0
- package/bundled-skills/weather-observation-fetching/SKILL.md +246 -0
- package/bundled-skills/wiki-yylo/SKILL.md +114 -0
- package/bundled-skills/workflow-yylo/SKILL.md +107 -0
- package/package.json +1 -1
- package/skills_index.json +304 -0
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: weather-model-data-fetching
|
|
3
|
+
description: "Retrieve numerical weather prediction data from public AWS S3 and HTTP archives using GRIB2 inventories, byte ranges, Herbie, provider fallbacks, and verified caching."
|
|
4
|
+
category: data
|
|
5
|
+
risk: safe
|
|
6
|
+
source: self
|
|
7
|
+
source_type: self
|
|
8
|
+
date_added: "2026-09-18"
|
|
9
|
+
author: ShianMike
|
|
10
|
+
tags: [weather, grib2, aws-s3, herbie, noaa, nwp]
|
|
11
|
+
tools: [claude, cursor, gemini, codex]
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Weather Model Data Fetching
|
|
15
|
+
|
|
16
|
+
## Overview
|
|
17
|
+
|
|
18
|
+
Fetch numerical weather prediction data without treating a multi-gigabyte GRIB2
|
|
19
|
+
file as one indivisible download. Prefer an existing project adapter or Herbie;
|
|
20
|
+
use direct object-store byte ranges only when the supported path cannot express
|
|
21
|
+
the request.
|
|
22
|
+
|
|
23
|
+
This skill covers transport, inventory selection, caching, and verification. It
|
|
24
|
+
does not interpret the forecast or decide whether a model is meteorologically
|
|
25
|
+
appropriate.
|
|
26
|
+
|
|
27
|
+
## When to Use This Skill
|
|
28
|
+
|
|
29
|
+
- A task needs GFS, GEFS, HRRR, RAP, NAM, IFS, or similar model output.
|
|
30
|
+
- Data lives in a public AWS S3 bucket, NOMADS, or a public cloud mirror.
|
|
31
|
+
- The input is GRIB2 and only selected variables or levels are needed.
|
|
32
|
+
- A point, sounding, time series, map, or batch job needs a reliable fetch path.
|
|
33
|
+
- A download is missing, partial, unexpectedly large, slow, or hard to resume.
|
|
34
|
+
|
|
35
|
+
Do not activate this skill for ordinary weather-forecast questions that do not
|
|
36
|
+
require model files.
|
|
37
|
+
|
|
38
|
+
## Define the Request First
|
|
39
|
+
|
|
40
|
+
Resolve these values before downloading:
|
|
41
|
+
|
|
42
|
+
- model and product;
|
|
43
|
+
- initialization cycle in UTC;
|
|
44
|
+
- forecast hour and therefore valid time (`valid = initialization + lead`);
|
|
45
|
+
- ensemble member when applicable;
|
|
46
|
+
- variables, vertical levels, and surface fields;
|
|
47
|
+
- point, region, or full-grid output;
|
|
48
|
+
- cache location and when the downloaded data may be deleted.
|
|
49
|
+
|
|
50
|
+
Confirm that the cycle is complete, the forecast hour exists for that cycle,
|
|
51
|
+
and the requested location is inside the model domain. A recent `404` often
|
|
52
|
+
means the cycle is not published yet; step back to a completed cycle instead of
|
|
53
|
+
retrying indefinitely.
|
|
54
|
+
|
|
55
|
+
## Choose the Smallest Retrieval Route
|
|
56
|
+
|
|
57
|
+
1. Reuse the project's existing fetch/cache abstraction when it already handles
|
|
58
|
+
the model.
|
|
59
|
+
2. Use Herbie for a supported GRIB2 model. It discovers AWS, NOMADS, Google,
|
|
60
|
+
Azure, and other configured sources and understands their key layouts.
|
|
61
|
+
3. Use a provider-native point or Zarr endpoint when the task needs a tiny
|
|
62
|
+
spatial slice from many times or members.
|
|
63
|
+
4. Use direct S3 or HTTPS object access when the key is known and no suitable
|
|
64
|
+
adapter exists.
|
|
65
|
+
|
|
66
|
+
Do not recursively list a large public bucket to discover one run. Build the
|
|
67
|
+
documented prefix for the model, cycle, product, forecast hour, and member, then
|
|
68
|
+
probe that exact object and its inventory.
|
|
69
|
+
|
|
70
|
+
Use an explicit provider priority and record the provider that succeeded. A
|
|
71
|
+
fallback must refer to the same model run, product, member, and forecast hour;
|
|
72
|
+
never silently substitute a different forecast.
|
|
73
|
+
|
|
74
|
+
## Subset GRIB2 by Inventory
|
|
75
|
+
|
|
76
|
+
GRIB2 files contain consecutive messages. A companion inventory such as
|
|
77
|
+
`.idx`, `.grib2.idx`, or `.grb2.inv` records each message's starting byte.
|
|
78
|
+
|
|
79
|
+
1. Fetch the small inventory first.
|
|
80
|
+
2. Inspect its actual rows before writing a regex.
|
|
81
|
+
3. Select exact variables, levels, and forecast-step records.
|
|
82
|
+
4. Set each selected message's end byte to one less than the next message's
|
|
83
|
+
start; request the final selected message through EOF when no end is known.
|
|
84
|
+
5. Coalesce adjacent selected messages into one range.
|
|
85
|
+
6. Issue one `Range: bytes=START-END` request per range. S3 does not support
|
|
86
|
+
multiple ranges in one `GetObject` request.
|
|
87
|
+
7. Require `206 Partial Content` and a matching `Content-Range`. If a server
|
|
88
|
+
answers `200`, do not append the whole object as though it were a fragment.
|
|
89
|
+
8. Pin the object's length and identity (`ETag` and/or `Last-Modified`) while
|
|
90
|
+
downloading. Discard fragments if the object changes.
|
|
91
|
+
9. Assemble into a temporary file, verify it with a GRIB decoder, then rename
|
|
92
|
+
atomically into the cache.
|
|
93
|
+
|
|
94
|
+
A GRIB message contains one field over its grid. Message-range subsetting saves
|
|
95
|
+
variables and levels, not geography. A point request still downloads the full
|
|
96
|
+
grid for every selected message unless the provider offers a point, regional,
|
|
97
|
+
Zarr, or other chunked endpoint.
|
|
98
|
+
|
|
99
|
+
## Herbie Example
|
|
100
|
+
|
|
101
|
+
Use the current `search` argument; `searchString` is deprecated. Start from the
|
|
102
|
+
inventory, fail on an empty match, and keep the download directory explicit.
|
|
103
|
+
|
|
104
|
+
```python
|
|
105
|
+
from pathlib import Path
|
|
106
|
+
|
|
107
|
+
from herbie import Herbie
|
|
108
|
+
|
|
109
|
+
PRESSURE_FIELDS = (
|
|
110
|
+
r":(?:HGT|TMP|RH|SPFH|UGRD|VGRD):\d+(?:\.\d+)? mb:"
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def fetch_hrrr_pressure_run(initialization, forecast_hour, cache_dir):
|
|
115
|
+
cache_dir = Path(cache_dir)
|
|
116
|
+
h = Herbie(
|
|
117
|
+
initialization,
|
|
118
|
+
model="hrrr",
|
|
119
|
+
product="prs",
|
|
120
|
+
fxx=forecast_hour,
|
|
121
|
+
priority=["aws", "nomads", "google", "azure"],
|
|
122
|
+
save_dir=cache_dir,
|
|
123
|
+
verbose=False,
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
selected = h.inventory(PRESSURE_FIELDS)
|
|
127
|
+
if selected.empty:
|
|
128
|
+
raise RuntimeError("inventory matched no pressure-level fields")
|
|
129
|
+
|
|
130
|
+
downloaded = h.download(PRESSURE_FIELDS, errors="raise")
|
|
131
|
+
path = Path(downloaded) if downloaded is not None else None
|
|
132
|
+
if path is None or not path.is_file() or path.stat().st_size == 0:
|
|
133
|
+
raise RuntimeError("GRIB2 subset was not materialized")
|
|
134
|
+
|
|
135
|
+
return path, {
|
|
136
|
+
"model": h.model,
|
|
137
|
+
"product": h.product,
|
|
138
|
+
"initialization": h.date.isoformat(),
|
|
139
|
+
"forecast_hour": h.fxx,
|
|
140
|
+
"valid_time": h.valid_date.isoformat(),
|
|
141
|
+
"provider": h.grib_source,
|
|
142
|
+
"remote_object": str(h.grib),
|
|
143
|
+
"messages": len(selected),
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
For xarray output, call `h.xarray(search, ...)` and handle either one
|
|
148
|
+
`xarray.Dataset` or a list of incompatible GRIB hypercubes. Merge only groups
|
|
149
|
+
whose coordinates and dimensions are compatible, and close every dataset when
|
|
150
|
+
finished.
|
|
151
|
+
|
|
152
|
+
## Public AWS S3 Diagnostics
|
|
153
|
+
|
|
154
|
+
NOAA Open Data buckets allow unsigned reads. `--no-sign-request` prevents the
|
|
155
|
+
AWS CLI from loading credentials; it does not disable TLS verification.
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
aws s3 ls --no-sign-request s3://noaa-hrrr-bdp-pds/hrrr.YYYYMMDD/conus/
|
|
159
|
+
|
|
160
|
+
aws s3api get-object --no-sign-request \
|
|
161
|
+
--bucket noaa-hrrr-bdp-pds \
|
|
162
|
+
--key "hrrr.YYYYMMDD/conus/hrrr.tHHz.wrfprsfFF.grib2" \
|
|
163
|
+
--range "bytes=START-END" fragment.grib2
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
Use these commands to inspect a documented public object or reproduce one
|
|
167
|
+
known range. For normal multi-message assembly, reuse Herbie or the project's
|
|
168
|
+
tested downloader instead of scripting binary concatenation in shell.
|
|
169
|
+
|
|
170
|
+
## Complete Sounding Contract
|
|
171
|
+
|
|
172
|
+
A pressure-level file alone may not contain a usable surface row. Before
|
|
173
|
+
building a vertical profile, require:
|
|
174
|
+
|
|
175
|
+
- all published isobaric levels for geopotential height, temperature, a
|
|
176
|
+
moisture variable (dew point, relative humidity, or specific humidity), and
|
|
177
|
+
U/V wind;
|
|
178
|
+
- surface pressure and terrain or surface height;
|
|
179
|
+
- 2 m temperature and moisture;
|
|
180
|
+
- 10 m U/V wind.
|
|
181
|
+
|
|
182
|
+
Some providers split pressure and surface fields into separate products. Fetch
|
|
183
|
+
and join the companion product from the same run, or reject the request with a
|
|
184
|
+
list of missing fields. Do not fabricate a ground row or silently reduce the
|
|
185
|
+
profile to a short mandatory-level list.
|
|
186
|
+
|
|
187
|
+
After decoding, sort pressure monotonically, remove duplicate levels, normalize
|
|
188
|
+
units and longitude conventions, and run the consuming project's profile QC.
|
|
189
|
+
|
|
190
|
+
## Point and Batch Extraction
|
|
191
|
+
|
|
192
|
+
- On one-dimensional latitude/longitude grids, labeled nearest selection may be
|
|
193
|
+
sufficient.
|
|
194
|
+
- On projected or curvilinear grids with two-dimensional coordinates, use the
|
|
195
|
+
project's model-aware nearest-cell routine; verify the selected latitude,
|
|
196
|
+
longitude, and distance.
|
|
197
|
+
- For many points from one model hour, fetch and decode once, then reuse it.
|
|
198
|
+
- For many hours, members, or regional slices, compare the GRIB route with a
|
|
199
|
+
chunked Zarr or provider-native endpoint before scaling up.
|
|
200
|
+
|
|
201
|
+
## Reliability, Cache, and Cleanup
|
|
202
|
+
|
|
203
|
+
- Cache by provider, object key, object identity, and field selection. A
|
|
204
|
+
filename alone is not enough provenance.
|
|
205
|
+
- Retry timeouts, `408`, `429`, and transient `5xx` responses with bounded
|
|
206
|
+
exponential backoff and jitter; honor `Retry-After`.
|
|
207
|
+
- Do not retry permission errors, malformed inventories, or impossible model
|
|
208
|
+
coordinates as transient failures.
|
|
209
|
+
- Bound concurrency. More range workers can increase throttling and make
|
|
210
|
+
cancellation slower.
|
|
211
|
+
- Keep partial files separate from valid cache entries and resume only when the
|
|
212
|
+
remote object identity still matches.
|
|
213
|
+
- For a one-shot render or export, isolate data in a request-specific temporary
|
|
214
|
+
directory and remove it in `finally` after the derived artifact is durable.
|
|
215
|
+
- For an interactive viewer, retain data until the final consumer closes. Never
|
|
216
|
+
delete a shared user cache as request cleanup.
|
|
217
|
+
|
|
218
|
+
Measure discovery, inventory, transfer, decode, point extraction, and rendering
|
|
219
|
+
separately. A slow end-to-end request is not evidence that GRIB decoding is the
|
|
220
|
+
bottleneck.
|
|
221
|
+
|
|
222
|
+
## Verification Checklist
|
|
223
|
+
|
|
224
|
+
- The resolved initialization time, forecast hour, valid time, product, and
|
|
225
|
+
member match the request.
|
|
226
|
+
- The selected inventory is nonempty and contains every required field/level.
|
|
227
|
+
- The response status, byte ranges, lengths, and object identity are consistent.
|
|
228
|
+
- The final file is nonempty and opens with the intended GRIB decoder.
|
|
229
|
+
- Decoded variables, units, level count, grid coordinates, and valid time are
|
|
230
|
+
plausible and explicit.
|
|
231
|
+
- A point result reports the actual selected grid coordinate.
|
|
232
|
+
- Cancellation leaves no file that can be mistaken for a complete cache hit.
|
|
233
|
+
- Cleanup preserves the requested final artifact and removes only data owned by
|
|
234
|
+
that request.
|
|
235
|
+
|
|
236
|
+
## Security & Safety Notes
|
|
237
|
+
|
|
238
|
+
- Fetch only public datasets or resources the user is authorized to access.
|
|
239
|
+
- Do not put cloud credentials in code, URLs, logs, examples, or skill files.
|
|
240
|
+
- Keep certificate verification enabled; never solve TLS errors with
|
|
241
|
+
`--no-verify-ssl`.
|
|
242
|
+
- Validate inventory-derived ranges against the remote object length before
|
|
243
|
+
allocating buffers or writing files.
|
|
244
|
+
- Bound requested cycles, members, forecast hours, concurrency, disk usage, and
|
|
245
|
+
retries before a large batch.
|
|
246
|
+
- Follow provider usage policies and preserve required dataset attribution.
|
|
247
|
+
|
|
248
|
+
## Common Pitfalls
|
|
249
|
+
|
|
250
|
+
- **No data for the newest run:** The cycle is still publishing. Use the newest
|
|
251
|
+
completed cycle and report the fallback.
|
|
252
|
+
- **Subset is as large as the full file:** The inventory was missing, the regex
|
|
253
|
+
was too broad, or the server ignored `Range`.
|
|
254
|
+
- **xarray returns a list:** The selected messages form multiple incompatible
|
|
255
|
+
hypercubes. Process them separately or merge only compatible groups.
|
|
256
|
+
- **Point extraction is still expensive:** GRIB message ranges are not spatial
|
|
257
|
+
chunks. Use a point/regional service or Zarr when available.
|
|
258
|
+
- **A cached file opens but has missing fields:** Validate the inventory contract
|
|
259
|
+
and object identity before accepting a cache hit.
|
|
260
|
+
|
|
261
|
+
## Limitations
|
|
262
|
+
|
|
263
|
+
- Provider key layouts, retention windows, model schedules, and Herbie templates
|
|
264
|
+
can change; verify them against current provider documentation.
|
|
265
|
+
- Variable subsetting requires a usable remote inventory. Without one, download
|
|
266
|
+
the full object or use a different provider.
|
|
267
|
+
- This skill does not validate forecast skill, scientific suitability, or
|
|
268
|
+
proprietary-provider credentials and quotas.
|
|
269
|
+
|
|
270
|
+
## Additional Resources
|
|
271
|
+
|
|
272
|
+
- [Herbie documentation](https://herbie.readthedocs.io/)
|
|
273
|
+
- [Herbie source and model templates](https://github.com/blaylockbk/Herbie)
|
|
274
|
+
- [NOAA fast GRIB2 downloads with inventories](https://nomads.ncep.noaa.gov/info.php?page=fastdownload)
|
|
275
|
+
- [Amazon S3 `GetObject` byte ranges](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html)
|
|
276
|
+
- [NOAA HRRR on the AWS Registry of Open Data](https://registry.opendata.aws/noaa-hrrr-pds/)
|
|
277
|
+
- [NOAA GFS on the AWS Registry of Open Data](https://registry.opendata.aws/noaa-gfs-bdp-pds/)
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: weather-observation-fetching
|
|
3
|
+
description: "Retrieve surface and upper-air weather observations from authoritative APIs and archives with station identity, time, units, and quality flags preserved."
|
|
4
|
+
category: data
|
|
5
|
+
risk: safe
|
|
6
|
+
source: self
|
|
7
|
+
source_type: self
|
|
8
|
+
date_added: "2026-09-19"
|
|
9
|
+
author: ShianMike
|
|
10
|
+
tags: [weather, observations, metar, radiosonde, noaa, quality-control]
|
|
11
|
+
tools: [claude, cursor, gemini, codex]
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Weather Observation Fetching
|
|
15
|
+
|
|
16
|
+
## Overview
|
|
17
|
+
|
|
18
|
+
Retrieve measured surface and upper-air weather reports without losing station
|
|
19
|
+
identity, observation time, units, raw values, or provider quality flags. Pick
|
|
20
|
+
the source by observation type and retention need, then validate the returned
|
|
21
|
+
records before normalization.
|
|
22
|
+
|
|
23
|
+
This skill covers METARs, historical surface observations, radiosondes, and
|
|
24
|
+
station metadata. It excludes model output, radar volumes, and satellite
|
|
25
|
+
imagery.
|
|
26
|
+
|
|
27
|
+
## When to Use This Skill
|
|
28
|
+
|
|
29
|
+
- A task needs recent METAR observations for named stations or a small region.
|
|
30
|
+
- Historical hourly or synoptic surface data is needed from NOAA NCEI.
|
|
31
|
+
- A sounding workflow needs observed radiosonde profiles rather than model
|
|
32
|
+
profiles.
|
|
33
|
+
- Station identifiers, relocations, instruments, or metadata must be resolved.
|
|
34
|
+
- A fetch returned duplicate, stale, unit-ambiguous, or quality-flagged values.
|
|
35
|
+
|
|
36
|
+
Do not use forecast products as observations, and do not substitute a nearby
|
|
37
|
+
model grid point for a missing station report without explicit approval.
|
|
38
|
+
|
|
39
|
+
## Choose the Source
|
|
40
|
+
|
|
41
|
+
| Need | Preferred source | Notes |
|
|
42
|
+
| --- | --- | --- |
|
|
43
|
+
| Recent aviation surface reports | NOAA Aviation Weather Center Data API | Query a small station/time set; use published cache files for bulk current data. |
|
|
44
|
+
| Historical global surface reports | NOAA NCEI Integrated Surface Database (ISD) | Preserve USAF/WBAN identity, units, and QC fields. |
|
|
45
|
+
| Historical or recent radiosondes | NOAA NCEI IGRA | Use the station inventory and retain level and QC metadata. |
|
|
46
|
+
| Station history and identifier changes | NOAA NCEI station history/HOMR | Resolve moves, renames, and observing-platform changes. |
|
|
47
|
+
|
|
48
|
+
Prefer an existing project adapter when it already handles the provider's
|
|
49
|
+
schema, retries, and cache. Record the exact endpoint or archive object used.
|
|
50
|
+
|
|
51
|
+
## Define the Observation Request
|
|
52
|
+
|
|
53
|
+
Resolve these values before fetching:
|
|
54
|
+
|
|
55
|
+
- observation type and variables;
|
|
56
|
+
- station identifier system, not just the identifier string;
|
|
57
|
+
- start and end instants in UTC, including interval inclusivity;
|
|
58
|
+
- maximum acceptable observation age;
|
|
59
|
+
- raw, decoded, or both output forms;
|
|
60
|
+
- required quality flags and policy for rejected values;
|
|
61
|
+
- output units and missing-value representation;
|
|
62
|
+
- cache location and retention.
|
|
63
|
+
|
|
64
|
+
For spatial queries, also define the search geometry, distance limit, and how a
|
|
65
|
+
station is selected. Return the selected station and distance rather than
|
|
66
|
+
silently using the nearest report.
|
|
67
|
+
|
|
68
|
+
## Fetch Recent METARs
|
|
69
|
+
|
|
70
|
+
The Aviation Weather Center exposes machine-readable METAR data under
|
|
71
|
+
`/api/data/metar`. Send a descriptive user agent, keep the query narrow, and
|
|
72
|
+
handle a valid `204 No Content` separately from an error.
|
|
73
|
+
|
|
74
|
+
```python
|
|
75
|
+
import json
|
|
76
|
+
from urllib.error import HTTPError
|
|
77
|
+
from urllib.parse import urlencode
|
|
78
|
+
from urllib.request import Request, urlopen
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def fetch_metars(stations, hours=2):
|
|
82
|
+
station_ids = sorted({station.strip().upper() for station in stations})
|
|
83
|
+
if not station_ids or any(len(station) != 4 for station in station_ids):
|
|
84
|
+
raise ValueError("use one or more four-character ICAO station IDs")
|
|
85
|
+
if not 1 <= hours <= 24:
|
|
86
|
+
raise ValueError("hours must be between 1 and 24 for this narrow query")
|
|
87
|
+
|
|
88
|
+
query = urlencode({
|
|
89
|
+
"ids": ",".join(station_ids),
|
|
90
|
+
"format": "json",
|
|
91
|
+
"hours": hours,
|
|
92
|
+
})
|
|
93
|
+
request = Request(
|
|
94
|
+
f"https://aviationweather.gov/api/data/metar?{query}",
|
|
95
|
+
headers={"User-Agent": "weather-observation-fetching/1.0 contact@example.org"},
|
|
96
|
+
)
|
|
97
|
+
try:
|
|
98
|
+
with urlopen(request, timeout=30) as response:
|
|
99
|
+
if response.status == 204:
|
|
100
|
+
return []
|
|
101
|
+
records = json.load(response)
|
|
102
|
+
except HTTPError as exc:
|
|
103
|
+
if exc.code == 429:
|
|
104
|
+
raise RuntimeError("AWC rate limit reached; honor Retry-After") from exc
|
|
105
|
+
raise
|
|
106
|
+
|
|
107
|
+
if not isinstance(records, list):
|
|
108
|
+
raise RuntimeError("unexpected METAR response shape")
|
|
109
|
+
return records
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Replace the example contact address with an appropriate project contact. For a
|
|
113
|
+
large current snapshot, download the provider's compressed cache file once
|
|
114
|
+
instead of issuing many station queries.
|
|
115
|
+
|
|
116
|
+
## Fetch Historical Surface Data
|
|
117
|
+
|
|
118
|
+
For ISD:
|
|
119
|
+
|
|
120
|
+
1. Resolve the station using the current station inventory and its USAF/WBAN
|
|
121
|
+
identifiers.
|
|
122
|
+
2. Confirm that the station's coverage overlaps the requested time range.
|
|
123
|
+
3. Use bulk HTTPS files for a large historical request; avoid one network call
|
|
124
|
+
per observation.
|
|
125
|
+
4. Preserve the original report and source/QC codes before converting units.
|
|
126
|
+
5. Treat trace values, missing sentinels, and calm or variable winds according
|
|
127
|
+
to the data format documentation.
|
|
128
|
+
6. Join station metadata by both identifier and effective date when station
|
|
129
|
+
history matters.
|
|
130
|
+
|
|
131
|
+
Do not assume one station identifier always represents an unchanged location or
|
|
132
|
+
instrument throughout its archive.
|
|
133
|
+
|
|
134
|
+
## Fetch Radiosonde Profiles
|
|
135
|
+
|
|
136
|
+
For IGRA:
|
|
137
|
+
|
|
138
|
+
1. Search the station inventory by identifier or location and verify the
|
|
139
|
+
station's record period.
|
|
140
|
+
2. Fetch the station file covering the requested dates rather than scraping an
|
|
141
|
+
interactive page.
|
|
142
|
+
3. Select by the report's UTC time and retain nominal, launch, and release times
|
|
143
|
+
when the source supplies them.
|
|
144
|
+
4. Preserve pressure, height, temperature, moisture, wind, level type, and QC
|
|
145
|
+
fields. Standard and significant levels are both scientifically relevant.
|
|
146
|
+
5. Sort the profile only after parsing; do not invent levels or interpolate
|
|
147
|
+
across large gaps during acquisition.
|
|
148
|
+
6. Report an absent launch or incomplete profile explicitly.
|
|
149
|
+
|
|
150
|
+
Many upper-air stations usually report near 00 and 12 UTC, but the archive is
|
|
151
|
+
the authority. Do not manufacture a schedule or select a different day solely
|
|
152
|
+
because a nominal time is missing.
|
|
153
|
+
|
|
154
|
+
## Normalize Without Erasing Provenance
|
|
155
|
+
|
|
156
|
+
Each normalized record should retain:
|
|
157
|
+
|
|
158
|
+
- provider and dataset;
|
|
159
|
+
- station identifier plus identifier scheme;
|
|
160
|
+
- station latitude, longitude, elevation, and metadata effective date;
|
|
161
|
+
- observation time in UTC and, when available, receipt or ingestion time;
|
|
162
|
+
- raw report or raw archive row;
|
|
163
|
+
- decoded values with explicit units;
|
|
164
|
+
- provider quality flags and local QC decisions;
|
|
165
|
+
- retrieval time, source URL/object, and response identity.
|
|
166
|
+
|
|
167
|
+
Store original and converted values side by side when a conversion could affect
|
|
168
|
+
rounding. Never use the HTTP `Last-Modified` timestamp as the observation time.
|
|
169
|
+
|
|
170
|
+
## Quality Control and Deduplication
|
|
171
|
+
|
|
172
|
+
- Treat provider flags as data, not decoration. Define which flags are accepted,
|
|
173
|
+
rejected, or retained with warnings.
|
|
174
|
+
- Deduplicate on provider identity, station, observation time, and report type.
|
|
175
|
+
When corrected reports exist, preserve the correction lineage.
|
|
176
|
+
- Check physical ranges only after handling missing and trace encodings.
|
|
177
|
+
- Verify wind direction conventions, temperature scales, pressure units, and
|
|
178
|
+
precipitation accumulation periods before combining sources.
|
|
179
|
+
- Keep station time, observation time, and ingestion time distinct.
|
|
180
|
+
- Flag stale reports against the request's maximum age rather than returning
|
|
181
|
+
them as current conditions.
|
|
182
|
+
|
|
183
|
+
## Reliability and Caching
|
|
184
|
+
|
|
185
|
+
- Honor provider request limits, `Retry-After`, and published bulk-download
|
|
186
|
+
guidance.
|
|
187
|
+
- Retry timeouts, `408`, `429`, and transient `5xx` failures with bounded
|
|
188
|
+
backoff and jitter.
|
|
189
|
+
- Cache immutable archive files by URL/object identity and current API responses
|
|
190
|
+
for no longer than their update cadence permits.
|
|
191
|
+
- Write downloads to a temporary path, validate content and expected date range,
|
|
192
|
+
then rename atomically.
|
|
193
|
+
- Keep partial files separate from accepted cache entries.
|
|
194
|
+
- For one-shot processing, remove request-owned temporary observations in
|
|
195
|
+
`finally` only after the derived artifact and provenance record are durable.
|
|
196
|
+
|
|
197
|
+
## Verification Checklist
|
|
198
|
+
|
|
199
|
+
- The station identifier scheme and station metadata are explicit.
|
|
200
|
+
- All selected observations fall inside the requested UTC interval.
|
|
201
|
+
- The report time, receipt time, and retrieval time are not conflated.
|
|
202
|
+
- Units, missing sentinels, trace values, and QC flags are handled explicitly.
|
|
203
|
+
- Raw reports or rows remain available for audit.
|
|
204
|
+
- Duplicate and corrected reports follow a documented rule.
|
|
205
|
+
- A no-data response is distinguished from provider failure.
|
|
206
|
+
- The final result reports stale, incomplete, or rejected observations.
|
|
207
|
+
|
|
208
|
+
## Security & Safety Notes
|
|
209
|
+
|
|
210
|
+
- Use only public endpoints or data the user is authorized to access.
|
|
211
|
+
- Do not place API keys, credentials, signed URLs, or private station data in
|
|
212
|
+
examples, logs, caches, or provenance manifests.
|
|
213
|
+
- Keep TLS certificate verification enabled.
|
|
214
|
+
- Encode query parameters rather than concatenating untrusted station input into
|
|
215
|
+
a URL.
|
|
216
|
+
- Bound station count, time span, response size, retries, and parallelism.
|
|
217
|
+
- Follow provider terms, rate limits, and attribution requirements.
|
|
218
|
+
|
|
219
|
+
## Common Pitfalls
|
|
220
|
+
|
|
221
|
+
- **The latest METAR is old:** The station has not reported recently. Apply the
|
|
222
|
+
maximum-age contract and report staleness.
|
|
223
|
+
- **A station lookup returns the wrong site:** ICAO, WMO, USAF/WBAN, and IGRA
|
|
224
|
+
identifiers were treated as interchangeable. Preserve the identifier scheme.
|
|
225
|
+
- **Temperatures look extreme:** Missing sentinels or units were converted as
|
|
226
|
+
real values. Parse format metadata before unit conversion.
|
|
227
|
+
- **A sounding has too few levels:** Only mandatory levels were retained or the
|
|
228
|
+
launch was incomplete. Preserve significant levels and surface data.
|
|
229
|
+
- **An archive record moved:** Station history changed. Join metadata by its
|
|
230
|
+
effective period and record the selected version.
|
|
231
|
+
|
|
232
|
+
## Limitations
|
|
233
|
+
|
|
234
|
+
- Provider schemas, retention windows, station inventories, and usage limits can
|
|
235
|
+
change; consult current official documentation.
|
|
236
|
+
- Quality flags identify known conditions but do not guarantee that a
|
|
237
|
+
measurement is scientifically suitable for a particular analysis.
|
|
238
|
+
- This skill does not perform radar retrieval, satellite retrieval, model-data
|
|
239
|
+
fetching, or forecast verification.
|
|
240
|
+
|
|
241
|
+
## Additional Resources
|
|
242
|
+
|
|
243
|
+
- [NOAA Aviation Weather Center Data API](https://aviationweather.gov/data/api/)
|
|
244
|
+
- [NOAA NCEI Integrated Surface Database](https://www.ncei.noaa.gov/products/land-based-station/integrated-surface-database)
|
|
245
|
+
- [NOAA NCEI Integrated Global Radiosonde Archive](https://www.ncei.noaa.gov/products/weather-balloon/integrated-global-radiosonde-archive)
|
|
246
|
+
- [NOAA NCEI station histories](https://www.ncei.noaa.gov/products/land-based-station/station-histories)
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: wiki-yylo
|
|
3
|
+
description: Use YYLO Ledger wiki Records as durable project knowledge. Search before
|
|
4
|
+
creating, classify information correctly, and make revision-safe Markdown updates
|
|
5
|
+
without editing Ledger storage directly.
|
|
6
|
+
category: project-management
|
|
7
|
+
risk: safe
|
|
8
|
+
source: https://github.com/yylo-dev/yylo-skills
|
|
9
|
+
source_repo: yylo-dev/yylo-skills
|
|
10
|
+
source_type: community
|
|
11
|
+
date_added: '2026-09-19'
|
|
12
|
+
license: MIT
|
|
13
|
+
license_source: https://github.com/yylo-dev/yylo-skills/blob/main/LICENSE
|
|
14
|
+
compatibility: Requires the `yy` CLI with the `wiki` record group installed (controller
|
|
15
|
+
or standalone). Revision-safe Markdown updates only; never edit Ledger storage directly.
|
|
16
|
+
argument-hint: '[wiki question or knowledge to find/create/update]'
|
|
17
|
+
enable-shell-directives: true
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
# Use YYLO wiki Records
|
|
21
|
+
|
|
22
|
+
Treat Ledger as the source of truth. Use `yy ledger` in a YYLO controller and
|
|
23
|
+
`yylo-ledger` in a standalone Ledger project. Inspect `COMMAND wiki --help` before
|
|
24
|
+
acting; if `wiki` is absent, the installed Ledger version does not expose native
|
|
25
|
+
Record commands and must not be bypassed with direct file edits.
|
|
26
|
+
|
|
27
|
+
## Choose the right record
|
|
28
|
+
|
|
29
|
+
Before writing, decide where the information belongs:
|
|
30
|
+
|
|
31
|
+
- **Wiki**: durable explanatory project or domain knowledge that future work must discover.
|
|
32
|
+
- **Task**: scoped requested work, status, dependencies, acceptance criteria, and completion evidence.
|
|
33
|
+
- **Workflow**: validated structured steps, not prose guidance.
|
|
34
|
+
- **Artifact**: generated evidence, reports, receipts, logs, model output, or binary payloads.
|
|
35
|
+
- **Source documentation**: documentation released and versioned with product code.
|
|
36
|
+
|
|
37
|
+
Do not put secrets, caches, session transcripts, temporary status, bulky generated
|
|
38
|
+
evidence, or owner-only operational receipts in a wiki.
|
|
39
|
+
|
|
40
|
+
## Discover before creating
|
|
41
|
+
|
|
42
|
+
Use bounded summary searches first. Resolve records by immutable ID whenever one
|
|
43
|
+
is known; slugs and aliases are discovery conveniences, not replacement identity.
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
yy ledger wiki search --text "deployment policy" --projection summary --limit 20 -f json
|
|
47
|
+
yy ledger wiki get RECORD_ID -f json
|
|
48
|
+
yy ledger wiki get RECORD_ID --raw
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Use `--scope archive|all` only when the request requires cold records. Request
|
|
52
|
+
`full` projection only when payload bytes are necessary.
|
|
53
|
+
|
|
54
|
+
## Create durable Markdown
|
|
55
|
+
|
|
56
|
+
Use a file or stdin for substantial or shell-sensitive content:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
yy ledger wiki create --title "Service ownership" --file ownership.md
|
|
60
|
+
yy ledger wiki create --title "Incident notes" --file - < incident-notes.md
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Choose a stable title, namespace, slug, aliases, and relations deliberately. Keep
|
|
64
|
+
one topic per Record and link related immutable Record IDs rather than duplicating
|
|
65
|
+
truth.
|
|
66
|
+
|
|
67
|
+
## Update safely
|
|
68
|
+
|
|
69
|
+
1. Read the current Record and revision.
|
|
70
|
+
2. Preserve its immutable ID and inspect history when intent is unclear.
|
|
71
|
+
3. Follow `wiki update --help` for the installed compare-and-replace controls.
|
|
72
|
+
4. Supply the expected revision and required preimage/digest evidence.
|
|
73
|
+
5. Use file transport; do not rewrite Ledger files yourself.
|
|
74
|
+
6. Read back the resulting revision and receipt.
|
|
75
|
+
|
|
76
|
+
A revision or preimage mismatch means the source changed: reread and reconcile.
|
|
77
|
+
Never force past concurrent edits. Archive is a lifecycle transition, not delete.
|
|
78
|
+
|
|
79
|
+
Use `--front-matter` only for canonical front-matter interchange and `--rendered`
|
|
80
|
+
for inert, HTML-escaped rendering. Use `history RECORD_ID` to understand revisions;
|
|
81
|
+
do not infer history from the latest payload alone.
|
|
82
|
+
|
|
83
|
+
## Project wiki boundary
|
|
84
|
+
|
|
85
|
+
Portable controller guidance may live under the controller wiki, while project
|
|
86
|
+
and domain pages retain project-owned paths. Package-managed and project-owned
|
|
87
|
+
pages can coexist. Migration, runtime replacement, exceptional merge recovery,
|
|
88
|
+
release, deployment, and cold-archive maintenance remain authoritative runbooks,
|
|
89
|
+
not content to summarize into an everyday global skill.
|
|
90
|
+
|
|
91
|
+
## Complete request
|
|
92
|
+
|
|
93
|
+
$ARGUMENTS
|
|
94
|
+
|
|
95
|
+
## When to Use
|
|
96
|
+
|
|
97
|
+
- You need durable project or domain knowledge as YYLO Ledger wiki Records (search, create, revision-safe update).
|
|
98
|
+
- You must first decide the record belongs in the wiki rather than a task, workflow, artifact, or product docs.
|
|
99
|
+
|
|
100
|
+
## Limitations
|
|
101
|
+
|
|
102
|
+
- Search before creating; one topic per Record, linked by immutable Record IDs.
|
|
103
|
+
- Never store secrets, caches, session transcripts, temporary status, bulky generated evidence, or owner-only receipts in a wiki.
|
|
104
|
+
- Updates bind to the expected revision/preimage; on mismatch reread and reconcile - never force past concurrent edits. Archive is a lifecycle transition, not deletion.
|
|
105
|
+
- If the `wiki` group is absent, fail closed and request a Ledger upgrade.
|
|
106
|
+
|
|
107
|
+
### Example
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
yy ledger wiki search --text "deployment policy" --projection summary --limit 20 -f json
|
|
111
|
+
yy ledger wiki get RECORD_ID -f json
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
> Adapted from [yylo-dev/yylo-skills](https://github.com/yylo-dev/yylo-skills) (MIT) - v2.0.1; frontmatter, When to Use/Limitations, and safety boundaries added for upstream compliance.
|