opencode-skills-collection 4.0.72 → 4.0.74

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.
Files changed (25) hide show
  1. package/bundled-skills/.antigravity-install-manifest.json +9 -1
  2. package/bundled-skills/agent-memory-discipline/SKILL.md +204 -0
  3. package/bundled-skills/agent-memory-discipline/references/entry-format.md +37 -0
  4. package/bundled-skills/antigravity-maintainer-batch-release/SKILL.md +2 -2
  5. package/bundled-skills/film-crew/SKILL.md +129 -0
  6. package/bundled-skills/film-crew/references/model-prompting.md +89 -0
  7. package/bundled-skills/film-crew/references/reroll-review.md +46 -0
  8. package/bundled-skills/film-crew/references/roles/director.md +38 -0
  9. package/bundled-skills/film-crew/references/roles/dp.md +28 -0
  10. package/bundled-skills/film-crew/references/roles/editor.md +34 -0
  11. package/bundled-skills/film-crew/references/roles/gaffer.md +30 -0
  12. package/bundled-skills/film-crew/references/roles/production-designer.md +43 -0
  13. package/bundled-skills/film-crew/references/roles/script-supervisor.md +35 -0
  14. package/bundled-skills/film-crew/references/roles/sound.md +23 -0
  15. package/bundled-skills/film-crew/references/templates/shot-list.md +38 -0
  16. package/bundled-skills/film-crew/references/unslop.md +29 -0
  17. package/bundled-skills/jev-social/SKILL.md +5 -5
  18. package/bundled-skills/noaa-radar-satellite-fetching/SKILL.md +253 -0
  19. package/bundled-skills/testdriver-e2e-testing/SKILL.md +121 -0
  20. package/bundled-skills/weather-data-lifecycle-management/SKILL.md +159 -0
  21. package/bundled-skills/weather-data-reproducibility/SKILL.md +292 -0
  22. package/bundled-skills/weather-model-run-discovery/SKILL.md +241 -0
  23. package/bundled-skills/weather-pipeline-performance-diagnosis/SKILL.md +184 -0
  24. package/package.json +1 -1
  25. package/skills_index.json +452 -1
@@ -0,0 +1,34 @@
1
+ # Editor
2
+
3
+ **Job:** make the shots add up to a video: durations, order, cuts, pacing. You think about
4
+ the timeline, not the frame.
5
+
6
+ ## Output
7
+
8
+ ```
9
+ TOTAL: 15.0 s (sum of shots, trimmed)
10
+ S1 2.5 s → hard cut
11
+ S2 4.0 s → match cut on motion
12
+ S3 3.0 s → smash cut
13
+ …
14
+ GENERATE: each shot +1 s handles (so S2 is generated at 5 s, used at 4 s)
15
+ HOOK CHECK: frame 1 is S1 ECU, motion starts at 0.2 s ✅
16
+ LOOP: last frame of S5 matches S1 composition ✅/❌
17
+ ```
18
+
19
+ ## Rules
20
+
21
+ - **Fit the model.** Every shot must be ≤ the model's max clip length (see
22
+ `references/model-prompting.md`). If a beat needs longer, split it into two shots with a
23
+ change of angle.
24
+ - **Generate long, use short.** Plan 0.5–1 s of handles at each end. The first and last
25
+ frames of AI clips are often the weakest.
26
+ - **Fixed-length models** (only preset lengths such as 5 s / 10 s): generate at the
27
+ shortest preset and pick the strongest section. A 2.5 s shot uses the best 2.5 s of a
28
+ 5 s clip; note which section in the timeline.
29
+ - **Short-form pacing:** 1.5–3 s per shot is normal; a 6 s static shot kills retention
30
+ unless something is happening in it.
31
+ - **Cut on action.** If S1 ends with a hand moving right, S2 should start with motion
32
+ continuing right.
33
+ - **Text goes in the edit,** not the prompt. Note captions/supers here with timings.
34
+ - Call out any shot that exists only for coverage. Coverage costs generations.
@@ -0,0 +1,30 @@
1
+ # Gaffer
2
+
3
+ **Job:** light the scene so it looks intentional and stays consistent between shots.
4
+
5
+ ## Output
6
+
7
+ ```
8
+ TIME / SOURCE: late afternoon sun through west window (motivated)
9
+ KEY: camera-left, 45°, soft
10
+ FILL: low, bounce from white tabletop
11
+ RIM / BACK: warm sun edge on hair
12
+ COLOR TEMP: warm key ~3200K vs cool ambient ~5600K
13
+ CONTRAST: medium-high, deep shadows
14
+ PRACTICALS: pendant bulbs visible in background, slightly blown
15
+ LOOK: 35mm film, fine grain, mild halation
16
+ ```
17
+
18
+ ## Rules
19
+
20
+ - **Motivate the light.** Say where it comes from (window, neon sign, streetlight,
21
+ monitor glow). Unmotivated "dramatic lighting" gives you random results.
22
+ - **Same key direction in every shot of a scene,** or the cut breaks continuity.
23
+ - **Contrast beats brightness.** Flat, evenly lit prompts are what make AI video look
24
+ like AI video. Ask for shadows.
25
+ - Color: pick one warm/cool contrast and hold it. Write it in plain words plus a
26
+ temperature if useful.
27
+ - Night scenes: name the sources (sodium streetlight, phone screen, neon). "Dark" alone
28
+ gets you murk.
29
+ - Products: soft key, clean rim to separate from background, a highlight that shows the
30
+ material (gloss, brushed metal, glass).
@@ -0,0 +1,43 @@
1
+ # Production designer
2
+
3
+ **Job:** make the world consistent. You write the **continuity bible**: the exact words
4
+ every other role must paste, verbatim, whenever a character, prop or location appears.
5
+
6
+ Video models have no memory between clips. The *only* continuity you get is identical
7
+ wording. Paraphrasing a character ("a woman in a red coat" → "the lady in crimson")
8
+ gives you a different person.
9
+
10
+ ## Output
11
+
12
+ ```
13
+ CHARACTERS
14
+ C1 <age range> <build> <hair: length, color, style> <skin tone> <face detail>,
15
+ wearing <top, color, material> and <bottom>, <one distinctive accessory>
16
+ LOCATIONS
17
+ L1 <place type>, <era/style>, <3 concrete set details>, <floor/wall materials>
18
+ PROPS
19
+ P1 <object>, <material>, <color>, <size cue>, <state: new/used/half-full…>
20
+ PALETTE
21
+ 3–5 colors, named plainly ("mustard yellow, teal, off-white")
22
+ ```
23
+
24
+ Every entry gets two versions:
25
+ - **FULL** — the whole description, for shots where the whole subject is in frame.
26
+ - **TIGHT** — only what a close-up can see (e.g. `C1-TIGHT: weathered hands, short
27
+ clean nails, a thin silver ring, sleeves of a faded olive sweatshirt pushed up`).
28
+
29
+ Close-ups use TIGHT verbatim; wider shots use FULL verbatim. Pasting a whole-person
30
+ description into an ECU of hands drags the rest of the person (and the set) into frame.
31
+
32
+ ## Rules
33
+
34
+ - 20–35 words per character. Concrete nouns and colors, no adjectives like "beautiful".
35
+ - One **distinctive anchor** per character (a yellow beanie, a scar, round glasses).
36
+ Anchors survive model drift better than faces do.
37
+ - Avoid real people, brands and logos. Describe the *type* ("a white leather low-top
38
+ sneaker") not the brand.
39
+ - Props that matter to the story get a state ("a paper cup, lid off, full to the brim
40
+ with black coffee"). State is what makes the action physically possible.
41
+ - Keep locations simple enough to re-generate: 3 set details, not 12.
42
+ - If the user supplies a reference image, write the bible *from the image* so the text
43
+ and the image agree.
@@ -0,0 +1,35 @@
1
+ # Script supervisor
2
+
3
+ **Job:** protect continuity and catch the shots that will fail *before* anyone spends a
4
+ generation on them. You have veto power: any shot you flag gets rewritten.
5
+
6
+ ## Checklist (run on every shot)
7
+
8
+ **Continuity**
9
+ - [ ] Every recurring character/prop/location is pasted verbatim from the continuity bible.
10
+ - [ ] Key light direction and color temperature match the rest of the scene.
11
+ - [ ] Screen direction is consistent (subject moving left→right keeps moving left→right).
12
+ - [ ] Props are in the right state (the cup that spilled in S2 isn't full in S3).
13
+
14
+ **Feasibility**
15
+ - [ ] One subject action, one camera move.
16
+ - [ ] Duration ≤ model max, with handles.
17
+ - [ ] No readable text, logos, UI or signage in frame (unless the model handles text).
18
+ - [ ] Hard physics (liquids, cloth, hands with small objects, multiple people touching) is
19
+ framed tight, isolated, and given a simple background.
20
+ - [ ] Nothing depends on a specific real person's likeness or a trademark.
21
+ - [ ] Counts are small: "two dogs" works better than "five dogs".
22
+
23
+ **Unslop** (see `references/unslop.md`)
24
+ - [ ] No empty quality words ("stunning, 8k, masterpiece, hyper-realistic, cinematic").
25
+ - [ ] No mood-only instructions; every feeling is translated into something visible.
26
+ - [ ] Skin, materials and motion have texture and imperfection specified where it matters.
27
+
28
+ ## Output
29
+
30
+ ```
31
+ S2 ⚠️ two actions (pours AND turns to customer) → split into S2a / S2b
32
+ S4 ⚠️ sign text "OPEN" in frame → remove, add in edit
33
+ S3 ✅
34
+ HIGHEST RISK: S2a (liquid physics). Reroll plan: tighten to ECU, lock camera.
35
+ ```
@@ -0,0 +1,23 @@
1
+ # Sound
2
+
3
+ **Job:** plan what the audience hears. Run this role only if the target model generates
4
+ audio, or the user will add music/SFX in the edit.
5
+
6
+ ## Output
7
+
8
+ ```
9
+ MUSIC: <genre, tempo in BPM, energy curve> (added in edit)
10
+ S1 SFX: ceramic clink, café murmur (low)
11
+ S2 DIALOGUE: C1: "Not again." (quiet, deadpan)
12
+ S3 SFX: liquid splash, sneaker squeak
13
+ ```
14
+
15
+ ## Rules
16
+
17
+ - **Audio-capable models:** put spoken lines in double quotes with the speaker named, keep
18
+ lines under ~8 words per shot, and name 1–2 SFX plus ambience. Too many sound cues
19
+ produce mush.
20
+ - **Silent models:** don't write sound into the prompt at all. It wastes tokens and can
21
+ drift the visuals. Put sound in the edit notes.
22
+ - Cut points should land on beats of the music (tell the editor the BPM).
23
+ - Short-form: design for sound-off first. If a line is essential, it also goes in a caption.
@@ -0,0 +1,38 @@
1
+ # SHOT LIST — <title>
2
+
3
+ **Format:** <aspect> · <total length> · target model: <model>
4
+ **Mode:** text-to-video | image-to-video (reference: <file/description>)
5
+ **Brand / product:** <name, or "none given — generic">
6
+ **Logline:** <one sentence>
7
+
8
+ ## Crew notes
9
+ **Director** — intent, hook, beats
10
+ **Production designer** — continuity bible (C1…, L1…, P1…)
11
+ **DP / Gaffer** — look summary in two lines
12
+ **Editor** — timeline summary
13
+ **Sound** — (if applicable)
14
+ **Script supervisor** — flags resolved
15
+
16
+ ## Shots
17
+ | # | Time | Size · Lens · Move | Action (one) | Gen length | Risk |
18
+ |---|---|---|---|---|---|
19
+ | S1 | 0.0–2.5 | ECU · 100mm · locked | … | 4 s | low |
20
+
21
+ ## Prompts
22
+
23
+ ### S1
24
+ ```
25
+ <prompt>
26
+ ```
27
+ Negative (if supported): `<negative prompt>`
28
+
29
+ ## Edit notes
30
+ - Captions / supers: <text> @ <time>
31
+ - Music / SFX: <cue> @ <time>
32
+
33
+ ## Reroll plan
34
+ | Shot | Likely failure | Change before reroll |
35
+ |---|---|---|
36
+ | S1 | … | … |
37
+
38
+ **Highest-risk shot:** S? — <why>
@@ -0,0 +1,29 @@
1
+ # Unslop: why AI video looks like AI video, and what to write instead
2
+
3
+ | Slop signal | Usual cause in the prompt | Write instead |
4
+ |---|---|---|
5
+ | Plastic, poreless skin | "beautiful", "flawless", "perfect skin" | "visible pores, slight shine on the forehead, faint under-eye shadows" |
6
+ | Everything evenly lit | no light source named | a motivated key ("hard sun through blinds, camera-left") and deep shadows |
7
+ | Floaty slow-motion drift | no speed given, "cinematic" | real-time speed, or a stated speed ("normal speed", "2x slow motion") |
8
+ | Camera wandering aimlessly | no camera instruction | one named move, or "locked-off tripod shot" |
9
+ | Morphing hands / objects | complex hand action, wide framing | tight framing, simple grip, one object, slow action |
10
+ | Faces changing between shots | paraphrased character descriptions | verbatim continuity-bible descriptors, or image-to-video from one reference |
11
+ | Oversaturated, HDR-ish color | "vibrant", "8k", "ultra HD" | a film look ("Kodak Portra 400, soft contrast, fine grain") and a limited palette |
12
+ | Symmetrical stock-footage framing | no composition choice | a lens, an angle and an off-center subject ("subject in left third") |
13
+ | Gibberish text | signage, labels, UI in frame | no readable text in frame; add text in the edit |
14
+ | Nothing actually happens | a mood instead of an action | one visible, physical action with a start and an end |
15
+
16
+ ## Words that add nothing
17
+
18
+ `stunning, masterpiece, best quality, 8k, 4k, ultra-detailed, hyper-realistic, award-winning, trending, epic, cinematic (alone), breathtaking`
19
+
20
+ Delete them. They don't hurt much on their own, but they push out words that would help.
21
+
22
+ ## Words that tend to help
23
+
24
+ - A **lens** (24mm, 50mm, 85mm, macro)
25
+ - A **camera move** (slow push-in, locked-off, handheld)
26
+ - A **light source** (window light, sodium streetlight, overhead fluorescent)
27
+ - A **film stock or look** (35mm film grain, Super 8, VHS camcorder, iPhone front camera)
28
+ - **Imperfection** (scuffed, fingerprints, wrinkled, condensation, frayed)
29
+ - **Real-time physics cues** (splashes, drips, recoils, bounces)
@@ -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)
@@ -0,0 +1,121 @@
1
+ ---
2
+ name: testdriver-e2e-testing
3
+ description: "Build E2E tests with TestDriver.ai, the AI code reviewer that runs every pull request in a real desktop sandbox, finds bugs, and builds regression tests"
4
+ category: testing
5
+ risk: safe
6
+ source: community
7
+ source_repo: testdriverai/testdriverai
8
+ source_type: official
9
+ date_added: "2026-09-24"
10
+ author: testdriverai
11
+ tags: [testing, e2e, qa, automation, computer-use]
12
+ tools: [claude, cursor, gemini]
13
+ license: "Apache-2.0"
14
+ license_source: "https://github.com/testdriverai/testdriverai/blob/main/LICENSE"
15
+ ---
16
+
17
+ # TestDriver End-to-End Testing
18
+
19
+ ## Overview
20
+
21
+ [TestDriver](https://testdriver.ai) is an AI code reviewer that actually runs your app. It automatically runs every pull request in a real desktop sandbox, finds bugs, and builds regression tests. Tests control browsers and native applications using natural language element descriptions and AI vision, and run as Vitest suites. This skill teaches an agent how to author, run, and debug TestDriver tests.
22
+
23
+ ## When to Use This Skill
24
+
25
+ - Use when you need to write an end-to-end test for a web or desktop application
26
+ - Use when automating a UI workflow that has no stable selectors (canvas, Electron, native apps)
27
+ - Use when the user asks to verify that a page or flow works ("check if the login page works")
28
+ - Use when debugging a failing TestDriver test
29
+
30
+ ## How It Works
31
+
32
+ ### Step 1: Set up the project
33
+
34
+ ```bash
35
+ npx testdriverai init
36
+ ```
37
+
38
+ This scaffolds `package.json`, example tests, `vitest.config.mjs`, and a GitHub Actions workflow. The user must set `TD_API_KEY` in `.env` (get a key at https://console.testdriver.ai/team).
39
+
40
+ ### Step 2: Write a test
41
+
42
+ Tests are Vitest suites using the TestDriver hooks:
43
+
44
+ ```javascript
45
+ import { describe, expect, it } from "vitest";
46
+ import { TestDriver } from "testdriverai/vitest/hooks";
47
+
48
+ describe("Login", () => {
49
+ it("signs in successfully", async (context) => {
50
+ const testdriver = TestDriver(context);
51
+ await testdriver.provision.chrome({ url: "https://example.com/login" });
52
+
53
+ const email = await testdriver.find("email input field");
54
+ await email.click();
55
+ await testdriver.type("user@example.com");
56
+
57
+ const submit = await testdriver.find("Sign In button");
58
+ await submit.click();
59
+
60
+ const result = await testdriver.assert("the dashboard is visible");
61
+ expect(result).toBeTruthy();
62
+ });
63
+ });
64
+ ```
65
+
66
+ ### Step 3: Run and iterate
67
+
68
+ ```bash
69
+ vitest run tests/login.test.mjs
70
+ ```
71
+
72
+ Screenshots are captured automatically before and after every command and saved to `.testdriver/screenshots/`, named with the source line number for easy debugging.
73
+
74
+ ## Examples
75
+
76
+ ### Example 1: Testing a desktop (Electron) app
77
+
78
+ ```javascript
79
+ await testdriver.provision.electron({ appPath: "./dist/my-app" });
80
+ const menu = await testdriver.find("File menu in the menu bar");
81
+ await menu.click();
82
+ ```
83
+
84
+ ### Example 2: Waiting for slow elements
85
+
86
+ ```javascript
87
+ const done = await testdriver.find("Loading complete indicator", { timeout: 30000 });
88
+ await done.click();
89
+ ```
90
+
91
+ ## Best Practices
92
+
93
+ - ✅ Use specific element descriptions ("blue Sign In button in the header", not "button")
94
+ - ✅ Set both `testTimeout` and `hookTimeout` to 900000 in `vitest.config.mjs`
95
+ - ✅ Add `assert()` calls for verifiable pass/fail conditions
96
+ - ✅ Always `await` every TestDriver call
97
+ - ❌ Do not use `npx vitest`; run `vitest run` directly
98
+ - ❌ Do not rely on CSS selectors; TestDriver locates elements visually
99
+
100
+ ## Limitations
101
+
102
+ - Requires a TestDriver API key (`TD_API_KEY`) and network access to provision sandboxes.
103
+ - Only works with Vitest as the test runner.
104
+ - This skill does not replace environment-specific validation, testing, or expert review.
105
+
106
+ ## Security & Safety Notes
107
+
108
+ - `npx testdriverai init` writes project files to the current directory; run it only in a project you intend to modify.
109
+ - The `TD_API_KEY` credential belongs in `.env` (gitignored by the scaffold). Never commit it.
110
+ - Tests execute inside an isolated remote sandbox, not on the local machine.
111
+
112
+ ## Common Pitfalls
113
+
114
+ - **Problem:** Cleanup hooks fail with a 10s timeout.
115
+ **Solution:** Set `hookTimeout: 900000` in `vitest.config.mjs`; sandbox teardown and recording uploads take longer than Vitest's default.
116
+ - **Problem:** Scrolling does nothing.
117
+ **Solution:** An input field has focus. Press Escape or click the page background first, then scroll.
118
+
119
+ ## Related Skills
120
+
121
+ - `@webapp-testing` - Playwright-based alternative for local web apps with stable DOM selectors