opencode-skills-collection 4.0.72 → 4.0.73

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "updatedAt": "2026-09-24T01:56:44.424Z",
3
+ "updatedAt": "2026-09-25T02:13:20.897Z",
4
4
  "entries": [
5
5
  "00-andruia-consultant",
6
6
  "007",
@@ -38,6 +38,7 @@
38
38
  "agent-harness-fault-injection",
39
39
  "agent-manager-skill",
40
40
  "agent-memory",
41
+ "agent-memory-discipline",
41
42
  "agent-memory-mcp",
42
43
  "agent-memory-systems",
43
44
  "agent-observability",
@@ -1603,6 +1604,7 @@
1603
1604
  "nfs-storage",
1604
1605
  "nft-standards",
1605
1606
  "nika",
1607
+ "noaa-radar-satellite-fetching",
1606
1608
  "nodejs-backend-patterns",
1607
1609
  "nodejs-best-practices",
1608
1610
  "nosql-expert",
@@ -2362,8 +2364,12 @@
2362
2364
  "warp-delegate",
2363
2365
  "warren-buffett",
2364
2366
  "wcag-audit-patterns",
2367
+ "weather-data-lifecycle-management",
2368
+ "weather-data-reproducibility",
2365
2369
  "weather-model-data-fetching",
2370
+ "weather-model-run-discovery",
2366
2371
  "weather-observation-fetching",
2372
+ "weather-pipeline-performance-diagnosis",
2367
2373
  "weaviate",
2368
2374
  "weaviate-cookbooks",
2369
2375
  "web-artifacts-builder",
@@ -0,0 +1,204 @@
1
+ ---
2
+ name: agent-memory-discipline
3
+ description: "Rules for when an agent should recall from long-term memory before acting and when it should save decisions, corrections and failures afterwards. Works with any memory backend."
4
+ category: memory
5
+ risk: safe
6
+ source: community
7
+ source_repo: mnemoverse/agent-memory-discipline
8
+ source_type: community
9
+ date_added: "2026-09-23"
10
+ author: mnemoverse
11
+ tags: [agent-memory, long-term-memory, context-engineering, mcp, agent-skills]
12
+ tools: [claude, cursor, gemini]
13
+ license: "CC0-1.0"
14
+ license_source: "https://github.com/mnemoverse/agent-memory-discipline/blob/main/LICENSE"
15
+ ---
16
+
17
+ # Agent Memory Discipline
18
+
19
+ ## Overview
20
+
21
+ Connecting a memory tool does not make an agent use it: tools register, the session runs, and nothing gets recalled or saved. This skill supplies the missing part, standing rules for when to read memory and when to write it.
22
+
23
+ The problem it solves is specific. An agent with memory available still repeats settled questions, reverts corrected habits, and loses decisions between sessions, because nothing tells it when recall and save are due. The rules below make both moments explicit.
24
+
25
+ ## When to Use This Skill
26
+
27
+ - Use when a memory tool or MCP memory server is connected but the agent is not using it consistently.
28
+ - Use when the user complains that the assistant loses preferences, conventions or past decisions between sessions.
29
+ - Use when setting up persistent memory for a project and the agent needs standing rules for reading and writing it.
30
+ - Use when the user says "remember this", "what did we decide", "recall", or "save this for next time".
31
+
32
+ ## How It Works
33
+
34
+ ### Before You Start: Any Memory Backend
35
+
36
+ The agent needs a memory tool it can call. Any backend works, and the rules are identical for each:
37
+
38
+ - **Files.** A `memory/` folder of Markdown notes, one fact per file. No dependencies, fully greppable, versionable in git.
39
+ - **A local MCP memory server.** Keeps everything on the local machine; several open-source options exist.
40
+ - **A hosted memory service over MCP.** Adds portability across tools and machines at the cost of the data living elsewhere.
41
+
42
+ Authentication is whatever the chosen backend requires: none for a local folder, the server's own configuration for a local MCP server, an API key or OAuth sign-in for a hosted service. This skill never handles credentials itself and never writes them into memory.
43
+
44
+ ### Step 1: Recall Before Acting
45
+
46
+ Read memory **before** doing any of these, not after:
47
+
48
+ - starting work on a project touched before
49
+ - choosing a library, pattern, or tool
50
+ - writing tests, commits, or documentation, where conventions apply
51
+ - answering "how do we usually do X here"
52
+ - anything the user phrases as "again", "like last time", or "as we agreed"
53
+
54
+ Skip recall for one-off factual questions, arithmetic, or anything fully specified in the current message. Recall costs a tool call and context; spending it on a self-contained question is waste.
55
+
56
+ Search with the words the user actually used, plus the project or repository name. If the first search returns nothing useful, try one broader query, then stop and proceed without memory rather than looping.
57
+
58
+ ### Step 2: Save After Deciding
59
+
60
+ Write to memory when one of these has just happened:
61
+
62
+ - a **decision** was made and will still matter next week ("we use pnpm", "the billing module stays untouched")
63
+ - the user **corrected** the agent, which is the strongest signal there is
64
+ - an approach **failed**, and why it failed
65
+ - a preference was stated that applies beyond this task
66
+ - a fact about the environment was discovered the hard way (a port, a flag, a service that must be running)
67
+
68
+ Do **not** save: the contents of files that can be read again, restatements of the current task, transient state, anything the user marked as temporary, and anything containing secrets, tokens, or personal data.
69
+
70
+ One memory, one fact. A paragraph containing four decisions cannot be superseded cleanly when one of them changes.
71
+
72
+ ### Step 3: Write It So It Survives
73
+
74
+ A memory that is useless in three weeks was written wrong. Give each entry, in the text if the backend has no fields for it:
75
+
76
+ - **what** was decided or observed, in one sentence
77
+ - **why**, briefly, because the reason outlives the decision
78
+ - **when** it became true, and when it stopped being true if it has
79
+ - **where it came from**: a file, a commit, a conversation, a test run
80
+
81
+ Prefer the user's own words over a paraphrase. Paraphrase drifts.
82
+
83
+ ### Step 4: Close the Past Instead of Overwriting It
84
+
85
+ When something changes, the old memory is not wrong. It is **closed**.
86
+
87
+ If the project moved from Redux to Zustand, "we use Redux" was true from January to June. Deleting it destroys the explanation for every component written in that window. Mark it superseded, keep its validity window, and write the new one alongside.
88
+
89
+ This is the single most destructive habit in agent memory, and it stays invisible until someone asks a question about old code.
90
+
91
+ ### Step 5: Keep Contradictions Visible
92
+
93
+ If recall returns two entries that disagree, do not pick the closer match and proceed. Surface both, with their dates, and ask or flag. A convention that a recent failure contradicts is exactly the situation where the user needs to be told, not smoothed over.
94
+
95
+ ### Step 6: Weigh Evidence and Policy Differently
96
+
97
+ - **Evidence** is what happened: one run, one failure, one observation. Cheap, plentiful, individually unreliable.
98
+ - **Policy** is what should happen: a convention, a decision, a rule. Expensive, and should be hard to change by accident.
99
+
100
+ An observation becomes policy when a human confirms it, when it lands in a merged decision record, or when it has worked repeatedly. Never promote a single observation to a rule without one of those.
101
+
102
+ ### What Following This Skill Produces
103
+
104
+ Two things, and nothing else:
105
+
106
+ - **Recalled context, stated before the work starts.** The relevant entries are named with their dates and sources, so the user can see what the agent is relying on. Conflicting entries are shown side by side, not merged.
107
+ - **New memory entries after decisions, corrections and failures.** One fact each, in this shape:
108
+
109
+ ```text
110
+ Project uses pnpm, not npm. Stated by the user on 2026-08-11 after a lockfile conflict. Applies to all packages in this repo.
111
+ ```
112
+
113
+ A superseded entry keeps its text and gains an end date and a pointer to the entry that replaced it. The full format, with closing and evidence examples, is in [references/entry-format.md](references/entry-format.md).
114
+
115
+ ## Examples
116
+
117
+ ### Example 1: A Correction
118
+
119
+ The user says: *"stop using npm here, we're on pnpm."*
120
+
121
+ 1. This is a correction, which is the strongest save signal. Save it.
122
+ 2. Write the entry:
123
+
124
+ ```text
125
+ Project uses pnpm, not npm. Stated by the user on 2026-08-11 after a lockfile conflict. Applies to all packages in this repo.
126
+ ```
127
+
128
+ 3. Do not also save "the user was annoyed", "ran npm install", or the lockfile contents.
129
+ 4. Next session, before running any package command in this repo, recall first and find it.
130
+
131
+ ### Example 2: A Contradiction
132
+
133
+ Recall returns two entries:
134
+
135
+ ```text
136
+ Integration tests run against the staging database (2026-06-02)
137
+ Integration tests use a local container; staging is off limits after the incident (2026-08-19)
138
+ ```
139
+
140
+ 1. Do not pick one and continue. State both, with dates.
141
+ 2. Ask: *"Memory has two rules for integration tests; the August one says staging is off limits. Use the local container?"*
142
+ 3. After the answer, close the entry that no longer holds, with its end date, and keep the other.
143
+
144
+ ### Example 3: Closing an Entry That Stopped Being True
145
+
146
+ Do not delete the old entry. Add an end date and a pointer to what replaced it, then write the new entry alongside:
147
+
148
+ ```text
149
+ [closed 2026-06-30, replaced by "State management uses Zustand"] State management uses Redux. Decided in the January architecture review.
150
+ State management uses Zustand. Migrated in June after the bundle size review. Applies to all new components.
151
+ ```
152
+
153
+ ## Best Practices
154
+
155
+ - **Do:** recall before project-specific work, and name the entries you rely on with their dates and sources.
156
+ - **Do:** save right after a decision, a correction, or a failure, in one sentence with its reason.
157
+ - **Do:** keep one fact per entry, so a later change can supersede it cleanly.
158
+ - **Do:** prefer the user's own words over a paraphrase.
159
+ - **Don't:** overwrite or remove an entry that stopped being true; close it with an end date instead.
160
+ - **Don't:** save file contents that can be read again, restatements of the current task, or transient state.
161
+ - **Don't:** promote a single observation to a rule without human confirmation, a merged decision record, or repeated success.
162
+
163
+ ## Limitations
164
+
165
+ - This skill installs no memory backend and requires no account. Without a memory tool the agent can call, it can only say that memory is unavailable and continue.
166
+ - It decides when to recall and what to save. How well entries are found again depends on the backend's own search.
167
+ - It does not resolve contradictions by itself. It surfaces them with their dates and asks the user which one holds.
168
+ - What happens to an entry the user asks to remove depends on what the backend supports.
169
+ - This skill does not replace environment-specific validation, testing, or expert review.
170
+ - Stop and ask for clarification if required inputs, permissions, or safety boundaries are missing.
171
+
172
+ ## Security & Safety Notes
173
+
174
+ - The skill contains no shell commands and makes no network calls of its own. It reads and writes memory only through the memory tool the user has already connected.
175
+ - Never save secrets, tokens, passwords, or personal data into memory, and never write credentials into an entry.
176
+ - A hosted memory backend stores entries outside the local machine. Choose the backend with that in mind.
177
+ - When the user asks for an entry to be removed, close or remove it as the backend allows, and confirm what was removed.
178
+
179
+ ## Common Pitfalls
180
+
181
+ - **Problem:** The memory tool is unavailable or failing.
182
+ **Solution:** Proceed without memory, say so in one line, and do not retry in a loop. Save the pending decision as soon as the tool is back, rather than dropping it.
183
+ - **Problem:** Recall returns nothing.
184
+ **Solution:** Run one broader query, then continue without memory. An empty result is information: the topic is new, so a decision made now is worth saving.
185
+ - **Problem:** Recall returns too much.
186
+ **Solution:** Keep the entries that match the current project and task; ignore the rest rather than pasting them into context.
187
+ - **Problem:** Two entries disagree.
188
+ **Solution:** Show both with their dates and ask which holds. Do not resolve the conflict silently.
189
+ - **Problem:** A save is rejected or filtered by the backend.
190
+ **Solution:** Report it once. Do not rephrase the same fact repeatedly to get it through.
191
+
192
+ ## Related Skills
193
+
194
+ - `@memory-systems`: when designing the memory architecture itself (short-term, long-term, graph-based) rather than the habit of using it.
195
+ - `@context-engineering`: when setting up rules files and session context, which this skill complements with rules for long-term memory.
196
+
197
+ ## Additional Resources
198
+
199
+ - [Upstream repository](https://github.com/mnemoverse/agent-memory-discipline) (CC0-1.0)
200
+ - [Agent Skills overview](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview)
201
+ - [Claude Code skills](https://code.claude.com/docs/en/skills)
202
+ - [Model Context Protocol](https://modelcontextprotocol.io), for connecting memory servers
203
+
204
+ *Written and maintained by the team behind [Mnemoverse](https://mnemoverse.com), which is one hosted implementation. The rules above are deliberately backend-neutral and were written to be useful without it.*
@@ -0,0 +1,37 @@
1
+ # Memory entry format
2
+
3
+ Reference for Step 3 and Step 4 of the skill. Use fields when the backend has them; otherwise write the same information into the text of the entry.
4
+
5
+ ## A new entry
6
+
7
+ | Part | What to write | Example |
8
+ |---|---|---|
9
+ | What | One sentence, the decision or observation | Project uses pnpm, not npm. |
10
+ | Why | The reason, briefly | Lockfile conflict between npm and pnpm. |
11
+ | When | The date it became true | 2026-08-11 |
12
+ | Source | Where it came from | Stated by the user in the session |
13
+ | Scope | Where it applies | All packages in this repository |
14
+
15
+ As a single line:
16
+
17
+ ```text
18
+ Project uses pnpm, not npm. Stated by the user on 2026-08-11 after a lockfile conflict. Applies to all packages in this repo.
19
+ ```
20
+
21
+ ## Closing an entry that stopped being true
22
+
23
+ Do not delete it. Add an end date and a pointer to what replaced it, then write the new entry alongside.
24
+
25
+ ```text
26
+ [closed 2026-06-30, replaced by "State management uses Zustand"] State management uses Redux. Decided in the January architecture review.
27
+ State management uses Zustand. Migrated in June after the bundle size review. Applies to all new components.
28
+ ```
29
+
30
+ ## Evidence and policy
31
+
32
+ Mark which kind an entry is, so a single observation is not read later as a rule.
33
+
34
+ ```text
35
+ [evidence] The integration suite failed twice against staging on 2026-08-19.
36
+ [policy] Integration tests use a local container; staging is off limits. Confirmed by the user on 2026-08-20.
37
+ ```
@@ -115,7 +115,7 @@ Use `data/specialized-plugin-candidates.json` for specialized-plugin membership
115
115
 
116
116
  Treat the current catalog and the legacy user-site bridge as one public system:
117
117
 
118
- - Current catalog: `sickn33/agentic-awesome-skills` at `https://sickn33.github.io/agentic-awesome-skills/`.
118
+ - Current catalog: `sickn33/agentic-awesome-skills` at `https://aaskills.tech/`.
119
119
  - Legacy bridge: `sickn33/sickn33.github.io` at `https://sickn33.github.io/antigravity-awesome-skills/`.
120
120
 
121
121
  For SEO, indexing, Pages, redirect, or infrastructure changes:
@@ -163,7 +163,7 @@ Every stable or prerelease version requires full release alignment. Creating the
163
163
  5. Merge that release PR through its required checks, update local `main` to equal `origin/main`, and wait for every source, release, or canonical-sync PR in the release path to close. Re-run the release-state and plugin gates if protected `main` moved.
164
164
  6. Run `npm run release:publish -- X.Y.Z`. It must resolve exactly one merged release PR from the same repository, authored by the repository owner, with base `main`, exact title `chore: release vX.Y.Z`, and head branch `release/vX.Y.Z`. Zero or multiple candidates fail closed; never select the newest approximate match. The command then verifies that exact protected merge before creating or reusing the tag and GitHub Release.
165
165
  The npm publication workflow must first check out protected `main`, verify that the peeled release tag is an ancestor of current `origin/main`, validate the version directly from the tagged `package.json`, and only then check out or execute tag-controlled code. It has no manual-dispatch bypass.
166
- 7. Wait for publishing workflows, then bind every proof to the exact released commit: verify the tag/ref, GitHub Release, npm version and intended dist-tag, required CI, CodeQL, and the explicitly dispatched release-only Pages build from the exact immutable `vX.Y.Z` tag. Never dispatch Pages from `main` or another branch. Verify live `llms.txt`, `skills.json`, catalog and plugin routes, and the legacy redirect bridge; do not accept a successful run for a different SHA.
166
+ 7. Wait for publishing workflows, then bind every proof to the exact released commit: verify the tag/ref, GitHub Release, npm version and intended dist-tag, required CI, CodeQL, and the release-tag Pages build from the exact immutable `vX.Y.Z` tag using `deployment_target=release`. Never manually dispatch the release-tag build from `main` or another branch. A separate `deployment_target=main` dispatch may publish a protected main commit after source and canonical-sync work completes; it must verify current-main identity before build and again before deploy. Canonical-sync commits marked `[skip pages]` are never dispatched by canonical synchronization. Verify live `llms.txt`, `skills.json`, catalog and plugin routes, and the legacy redirect bridge; do not accept a successful run for a different SHA.
167
167
  8. After npm confirms `X.Y.Z` as the published dist-tag, discover every already-configured local AAS MCP host from its real configuration and update each one to the exact same package version before declaring the release complete. Updating existing AAS host entries is part of the release; creating a previously absent host configuration still requires explicit authorization.
168
168
  - Use the published package's `aas mcp configure` two-pass flow: first preview the change, then repeat the identical command with its approval digest. Supply absolute host-config, cache, and backup paths; require a backup when replacing an existing configuration.
169
169
  - Pin `agentic-awesome-skills@X.Y.Z` and `--version X.Y.Z`; never use `latest`, reuse an older cached runtime, or create a previously absent host configuration without explicit authorization.
@@ -11,7 +11,7 @@ author: socai-io
11
11
  tags: [social-media, research, instagram, tiktok, linkedin, browser-automation, jev]
12
12
  tools: [claude, codex]
13
13
  license: "MIT"
14
- license_source: "https://github.com/socai-io/jev-social/blob/05581cac6b8c21c85e54883b5f2b93c16f40f419/LICENSE"
14
+ license_source: "https://github.com/socai-io/jev-social/blob/782d809c68e2015536359aa7dceede9a3cdbb7f1/LICENSE"
15
15
  ---
16
16
  # Jev Social
17
17
 
@@ -19,7 +19,7 @@ license_source: "https://github.com/socai-io/jev-social/blob/05581cac6b8c21c85e5
19
19
 
20
20
  Jev Social turns a natural-language social research goal into bounded Jev routing decisions, then delegates platform-read-only browser work to the local socai CLI. Use the captured posts, profiles, comments, videos, and opened details to produce a compact, source-linked report instead of exposing raw CLI output. "Read-only" means no social-account mutation; the CLI still writes private local run records and may download requested media.
21
21
 
22
- The executable examples below are pinned to the tested runtime commit included in Jev Social `v0.1.4`. A pin improves reproducibility but is not a trust guarantee; keep the package, browser data, and returned content inside the safety boundaries below.
22
+ The executable examples below are pinned to the tested runtime commit included in Jev Social `v0.1.5`. A pin improves reproducibility but is not a trust guarantee; keep the package, browser data, and returned content inside the safety boundaries below.
23
23
 
24
24
  ## When to Use
25
25
  - Use when a user requests evidence-backed research on Instagram, TikTok, or LinkedIn and wants real public posts or profiles rather than a general web summary.
@@ -45,7 +45,7 @@ If the exact pinned package is not already available locally, explain that the n
45
45
  Run the status command before every research task:
46
46
 
47
47
  ```bash
48
- npx github:socai-io/jev-social#05581cac6b8c21c85e54883b5f2b93c16f40f419 status
48
+ npx github:socai-io/jev-social#782d809c68e2015536359aa7dceede9a3cdbb7f1 status
49
49
  ```
50
50
 
51
51
  Require all of the following before continuing:
@@ -68,7 +68,7 @@ Pass the goal as one argument with an argv-capable process runner; never constru
68
68
  ```text
69
69
  program: npx
70
70
  argv:
71
- - github:socai-io/jev-social#05581cac6b8c21c85e54883b5f2b93c16f40f419
71
+ - github:socai-io/jev-social#782d809c68e2015536359aa7dceede9a3cdbb7f1
72
72
  - search
73
73
  - <exact research goal as one argument>
74
74
  - --platform
@@ -126,7 +126,7 @@ Use only TikTok if its capability is reported as supported. Open details before
126
126
  When the user explicitly asks for the local demo UI, start it on loopback only:
127
127
 
128
128
  ```bash
129
- npx github:socai-io/jev-social#05581cac6b8c21c85e54883b5f2b93c16f40f419 serve --port 8766
129
+ npx github:socai-io/jev-social#782d809c68e2015536359aa7dceede9a3cdbb7f1 serve --port 8766
130
130
  ```
131
131
 
132
132
  Report `http://127.0.0.1:8766`. Leave the process running only when the user asked for a local demo server, and do not expose it on a public interface.
@@ -0,0 +1,253 @@
1
+ ---
2
+ name: noaa-radar-satellite-fetching
3
+ description: "Retrieve NOAA NEXRAD and GOES products from public cloud archives using verified site, product, channel, sector, and scan-time selection."
4
+ category: data
5
+ risk: safe
6
+ source: self
7
+ source_type: self
8
+ date_added: "2026-09-24"
9
+ author: ShianMike
10
+ tags: [weather, noaa, nexrad, goes, radar, satellite, aws-s3]
11
+ tools: [claude, cursor, gemini, codex]
12
+ ---
13
+
14
+ # NOAA Radar and Satellite Fetching
15
+
16
+ ## Overview
17
+
18
+ Retrieve NOAA NEXRAD radar and GOES satellite objects from public cloud
19
+ archives while preserving the product, platform, spatial sector, and scan-time
20
+ identity. Discover through narrow prefixes, choose by observation time rather
21
+ than upload time, and validate the downloaded scientific file before use.
22
+
23
+ This skill covers raw or provider-produced radar and satellite products. It
24
+ does not retrieve numerical model output or ordinary station observations.
25
+
26
+ ## When to Use This Skill
27
+
28
+ - A task needs NEXRAD Level II archive volumes or real-time chunks.
29
+ - A task needs selected NEXRAD Level III products.
30
+ - GOES ABI, GLM, or another GOES-R product is needed for a time and region.
31
+ - A download must select the nearest completed scan within a tolerance.
32
+ - A public S3 key, satellite assignment, radar site, channel, or sector is
33
+ uncertain or has changed.
34
+
35
+ Do not activate this skill merely to display a third-party map tile or to answer
36
+ a general weather question.
37
+
38
+ ## Define the Product Contract
39
+
40
+ For NEXRAD, specify:
41
+
42
+ - Level II archive, Level II real-time chunks, or a named Level III product;
43
+ - four-character radar site, such as `KTLX`;
44
+ - desired scan time in UTC and nearest/previous/next selection policy;
45
+ - maximum time tolerance;
46
+ - full volume or exact product code;
47
+ - raw file retention and decoder.
48
+
49
+ For GOES, specify:
50
+
51
+ - physical satellite number or operational role, such as East or West;
52
+ - instrument and product level/short name;
53
+ - Full Disk, CONUS, Mesoscale 1, or Mesoscale 2 sector where applicable;
54
+ - ABI channel or derived product;
55
+ - desired scan time in UTC and tolerance;
56
+ - calibration form needed, such as radiance or brightness temperature.
57
+
58
+ Resolve an operational role to a physical satellite using current NOAA
59
+ documentation at request time. East and West assignments change over a
60
+ satellite program's lifetime.
61
+
62
+ ## Current Public AWS Routes
63
+
64
+ Consult the AWS Registry of Open Data before hard-coding a bucket. As of this
65
+ skill's publication:
66
+
67
+ - NEXRAD Level II archive: `s3://unidata-nexrad-level2/`
68
+ - NEXRAD Level II real-time chunks: `s3://unidata-nexrad-level2-chunks/`
69
+ - selected NEXRAD Level III real-time data: `s3://unidata-nexrad-level3/`
70
+ - GOES imagery and metadata: satellite-specific buckets such as
71
+ `s3://noaa-goes18/` and `s3://noaa-goes19/`
72
+
73
+ The former `noaa-nexrad-level2` bucket was deprecated and scheduled to become
74
+ unavailable on September 1, 2025. Do not copy that retired route from old
75
+ tutorials.
76
+
77
+ ## Discover with Narrow Prefixes
78
+
79
+ NEXRAD Level II archive objects are organized by UTC date and site. GOES
80
+ objects are organized by product, year, day of year, and hour. List only the
81
+ smallest prefix that can contain the requested scan.
82
+
83
+ ```bash
84
+ aws s3 ls --no-sign-request \
85
+ s3://unidata-nexrad-level2/YYYY/MM/DD/KXXX/
86
+
87
+ aws s3 ls --no-sign-request \
88
+ s3://noaa-goes19/ABI-L2-CMIPC/YYYY/DDD/HH/
89
+ ```
90
+
91
+ Replace every placeholder with a validated value. Include the adjacent hour or
92
+ UTC day only when the time tolerance crosses that boundary. Paginate listings
93
+ and bound the total keys inspected.
94
+
95
+ Use real-time chunk buckets only when the consumer is designed to assemble and
96
+ validate chunks. Prefer completed archive volumes for ordinary historical or
97
+ post-event processing.
98
+
99
+ ## Select by Scan Time
100
+
101
+ Object `Last-Modified` is publication metadata, not the measurement time.
102
+
103
+ - For NEXRAD, parse the site and scan timestamp from the documented object name,
104
+ then confirm time and site from the decoded volume header.
105
+ - For GOES-R, filenames encode platform plus scan start (`s`), end (`e`), and
106
+ creation (`c`) timestamps. Select by scan start or interval overlap, not file
107
+ creation time.
108
+ - Default to the closest scan at or before the requested instant for a
109
+ retrospective view. Allow a future scan only when the caller explicitly asks
110
+ for nearest-in-either-direction behavior.
111
+ - Reject every candidate outside the stated tolerance.
112
+ - When sectors overlap, require the requested sector instead of choosing solely
113
+ by time.
114
+
115
+ This standard-library helper extracts GOES-R scan timestamps without opening
116
+ the NetCDF payload:
117
+
118
+ ```python
119
+ import re
120
+ from datetime import datetime, timezone
121
+ from pathlib import PurePosixPath
122
+
123
+
124
+ GOES_TIMES = re.compile(
125
+ r"_s(?P<start>\d{14})_e(?P<end>\d{14})_c(?P<created>\d{14})"
126
+ )
127
+
128
+
129
+ def parse_goes_times(object_key):
130
+ match = GOES_TIMES.search(PurePosixPath(object_key).name)
131
+ if not match:
132
+ raise ValueError(f"unrecognized GOES-R filename: {object_key}")
133
+
134
+ def parse(value):
135
+ return datetime.strptime(value, "%Y%j%H%M%S%f").replace(
136
+ tzinfo=timezone.utc
137
+ )
138
+
139
+ return {name: parse(value) for name, value in match.groupdict().items()}
140
+ ```
141
+
142
+ Treat filename parsing as discovery. After download, verify the corresponding
143
+ time coverage and platform attributes inside the file.
144
+
145
+ ## Download and Validate
146
+
147
+ 1. Record bucket, exact key, size, ETag, and `Last-Modified` before transfer.
148
+ 2. Download to a request-owned temporary path. For public buckets, use unsigned
149
+ S3 access rather than supplying credentials.
150
+ 3. If the object might still be publishing, require stable metadata or pin a
151
+ conditional request to the observed object identity.
152
+ 4. Verify the received byte count and a provider checksum when one is supplied.
153
+ Otherwise compute and record a local SHA-256 digest.
154
+ 5. Open the object with an existing format-aware decoder.
155
+ 6. Verify site/platform, product, scan interval, and expected dimensions or
156
+ radar sweeps before renaming it into the cache.
157
+
158
+ Reuse an installed NEXRAD or NetCDF reader. Do not build a binary radar or
159
+ satellite decoder merely to fetch a file.
160
+
161
+ ## Radar-Specific Checks
162
+
163
+ - Confirm that the radar site is the requested site and was operational at the
164
+ scan time.
165
+ - Treat Level II volumes, real-time chunks, and Level III products as different
166
+ contracts; they are not interchangeable encodings.
167
+ - Verify volume start time, end time when available, sweep count, moments, and
168
+ elevation angles after decoding.
169
+ - Keep range folding, missing gates, quality masks, and velocity ambiguity
170
+ explicit.
171
+ - A radar's nominal coverage radius does not guarantee useful low-level data at
172
+ a location. Consider distance, beam height, terrain blockage, and outages.
173
+
174
+ ## Satellite-Specific Checks
175
+
176
+ - Confirm the physical satellite, instrument, product short name, sector, scan
177
+ mode, channel, and time coverage from NetCDF attributes.
178
+ - Do not treat ABI fixed-grid `x` and `y` coordinates as latitude and longitude.
179
+ Use the file's geostationary projection metadata.
180
+ - Apply scale/offset, fill values, data-quality flags, and product-specific
181
+ calibration according to NOAA documentation.
182
+ - A Mesoscale file is not identified only by its small dimensions; distinguish
183
+ Mesoscale 1 and 2 explicitly.
184
+ - Do not blend files from different scan modes, sectors, satellites, or product
185
+ levels without recording the transformation.
186
+
187
+ ## Reliability, Cache, and Cleanup
188
+
189
+ - Cache by bucket, key, and object identity, not a friendly timestamp alone.
190
+ - Retry timeouts, `408`, `429`, and transient `5xx` responses with bounded
191
+ backoff and jitter.
192
+ - Bound time tolerance, adjacent-hour listings, pagination, concurrency, and
193
+ disk usage.
194
+ - Keep partial downloads separate from valid cache entries.
195
+ - Use event notifications for continuous real-time ingestion when appropriate;
196
+ do not repeatedly scan broad prefixes.
197
+ - For a one-shot image or export, delete request-owned raw objects in `finally`
198
+ only after the final artifact and provenance manifest are durable.
199
+ - Never delete a shared user cache as request cleanup.
200
+
201
+ ## Verification Checklist
202
+
203
+ - The source bucket is current and documented by NOAA or its data distributor.
204
+ - Radar site or physical satellite and operational role are explicit.
205
+ - Product level, code/short name, sector, channel, and scan mode match the
206
+ request.
207
+ - The selected scan satisfies the direction policy and maximum time tolerance.
208
+ - Object size and identity match the downloaded bytes.
209
+ - The format-aware decoder opens the file and confirms internal metadata.
210
+ - Geolocation uses the product's real coordinate reference system.
211
+ - Temporary data cleanup preserves the requested artifact and manifest.
212
+
213
+ ## Security & Safety Notes
214
+
215
+ - Fetch only public data or resources the user is authorized to access.
216
+ - Never embed AWS credentials, signed URLs, private endpoints, or notification
217
+ subscription tokens in code or logs.
218
+ - Keep TLS verification enabled; `--no-sign-request` does not disable TLS.
219
+ - Validate site, product, channel, sector, and time inputs against allowlists
220
+ before constructing object prefixes or local paths.
221
+ - Bound response size and available disk space before downloading high-rate
222
+ radar or satellite streams.
223
+ - Preserve NOAA attribution and do not imply NOAA endorsement.
224
+
225
+ ## Common Pitfalls
226
+
227
+ - **Old NEXRAD examples return no data:** They reference the retired Level II
228
+ bucket. Resolve the current bucket from the registry.
229
+ - **The right minute shows the wrong image:** Creation time was used instead of
230
+ scan start/end time.
231
+ - **GOES East points to the wrong bucket:** An operational role was hard-coded
232
+ to a satellite number. Resolve the assignment for the requested date.
233
+ - **The map is displaced:** Fixed-grid scan angles were treated as geographic
234
+ coordinates. Apply the geostationary projection.
235
+ - **A real-time radar volume will not decode:** Individual chunks were treated
236
+ as a completed archive volume. Assemble and validate them or use the archive.
237
+
238
+ ## Limitations
239
+
240
+ - Buckets, satellite assignments, product availability, scan modes, and naming
241
+ conventions can change; verify current official documentation.
242
+ - This skill retrieves source products but does not guarantee meteorological
243
+ suitability, perform mosaicking, or implement scientific calibration.
244
+ - Historical gaps and instrument or site outages cannot be repaired by provider
245
+ fallback.
246
+
247
+ ## Additional Resources
248
+
249
+ - [NEXRAD on the AWS Registry of Open Data](https://registry.opendata.aws/noaa-nexrad/)
250
+ - [NOAA GOES on the AWS Registry of Open Data](https://registry.opendata.aws/noaa-goes/)
251
+ - [NOAA GOES-R documents](https://www.ospo.noaa.gov/resources/documents/goes-r.html)
252
+ - [NOAA STAR guide to satellite filenames](https://www.star.nesdis.noaa.gov/atmospheric-composition-training/satellite_data_decoding_data_file_names.php)
253
+ - [NOAA Radar Operations Center interface documents](https://www.roc.noaa.gov/wsr88d/BuildInfo/Files.aspx)