cybercentrecanada/howler/howler-row-mapping
Claude Code and agent skill by cybercentrecanada/howler
- community
Checking that the SKILL.md file is still in the repository.
Create, augment, explain, and apply reusable howler-client version-1 YAML mappings from saved JSONL row objects to Howler alerts. Use RowMapping/map_rows and the client's bundled schema, discover targets through the Howler hit-index API, and keep source rows, rendered records, and validation responses in files rather than prompts. Render and validate only; never ingest.
Install
npx vskill@latest install cybercentrecanada/howler/howler-row-mappingSKILL.md
Howler-client YAML row mappings
Use the released howler-client==3.4.0 mapping API, including the safe template transform from merged PR #689 and raw-row preservation from #688, to create a reusable, deterministic mapping. Apply it only to already-acquired JSONL row objects. Mapping and rendering do not call Howler, execute code from YAML, read the clock, generate random IDs, alter source rows, or ingest alerts.
RowMapping and map_rows own YAML parsing, the bundled schema, mapping semantics, and client-side checks. Do not copy the schema or add a custom loader, mapping engine, or target-value validator. See the YAML contract for the supported language and the client reference for API and validation responsibilities.
Map `howler.outline` through the same YAML mapping, not by editing rendered alerts. Always provide a meaningful, nonblank howler.outline.summary for every row. Set howler.outline.target and howler.outline.threat only when the source and analytic establish a victim and attacker, respectively; omit them otherwise. Map howler.outline.indicators whenever supported source observables are available. See outline authoring for field selection, templates, list transforms, and null handling. These are authoring requirements, not extra client schema rules.
Never set `howler.id`. It is server-generated; it is not a writable target, even when supplied as null or through a parent object. The client and API helper reject it. Determinism describes submitted payloads only, not server-assigned IDs or deduplication.
Inputs and files
Offline profiling, validation, and rendering need only the saved JSONL row objects, a mapping YAML file, and a supplied hit-index field snapshot. They do not require environment URLs or credentials. Confirm which Howler environment and index the mapping targets before authoring it. The network workflow supports the hit index and its validation endpoint only; it never ingests. If another index is intended, stop rather than silently using hit.
Use Python 3.12+ and uv. Every bundled PEP 723 script pins howler-client==3.4.0, the release used by this skill for native template transforms and raw-row preservation. Initial dependency installation needs network access; mapping itself remains offline once cached. See the client reference for the API contract. Set SKILL to this skill directory and WORK to a private, ignored directory for artifacts. Only network stages need the selected environment's HOWLER_API_URL and API token file (HOWLER_TOKEN_FILE). Commands also accept a supplied token in HOWLER_JWT. Never print credentials or place them in output files.
| File | Purpose | |
|---|---|---|
scripts/mapping.py | File-first profile, draft, augmentation, client validation, and rendering; no service calls. | |
scripts/api_fields.py | Materialize hit-index field metadata from /api/v1/search/fields/hit. | |
scripts/validate_ingestion.py | Send saved alert JSONL to Howler's validation API and save its complete response; never ingests. | |
references/yaml-format.md | Detailed client-native YAML language contract. | |
references/howler-client.md | Released client API examples and division of validation responsibilities. | |
references/outline.md | Summary, relevant target/threat, and indicator mappings using native transforms. |
Keep the working directory private and out of version control. Typical artifacts:
The helpers use private, atomic writes and protect inputs from accidental replacement. Do not put raw rows, generated records, credentials, or reports with rejected inputs in prompts or commits. Inspect saved artifacts with local tools. The scripts load the JSONL row objects into memory, so use a file of appropriate size.
Commands do not overwrite existing outputs by default. For reruns, choose new output names or use --replace for the intended output only; never replace the saved input rows or field snapshot.
Workflow
1. Profile the supplied rows
The profile reports observed JSON types, missing keys, and null counts without including sample values. It is descriptive, not a guarantee about future rows. If field meaning or semantics are unclear, ask the user before mapping; do not infer meaning from a name or type alone.
2. Use the supplied target snapshot or discover current fields
Use a supplied snapshot for offline authoring. To fetch or refresh target metadata, call the Howler API's hit-index fields endpoint directly:
The saved snapshot includes projected field names, descriptions, types, and list flags, the API URL, and a SHA-256 fingerprint. Review relevant target metadata; the endpoint may omit constraints such as required fields, enums, or regexes. This helper writes snapshot version 2; refresh any older MCP-derived snapshot before using it with this version of the skill.
3. Create or augment a native mapping
For a new mapping, create a draft:
An empty draft is not a valid RowMapping. The draft explicitly enables the client's default include_raw_data: true, which preserves the complete original row as the first detached object in howler.data, before transformations. Review unmapped source columns for sensitive data and confirm that retaining the whole row is appropriate for the selected environment and classification. If not, explicitly set include_raw_data: false in the mapping and report that decision; this disables only the automatic entry, not an explicit howler.data mapping.
Author the mapping in the client's native format; see the YAML reference. Ask the user to resolve uncertain column meanings, Howler/ECS targets, analytic labels, and classification choices. When a column's meaning or target is uncertain, present supported alternatives and wait for the user's selection before mapping it. It may remain unmapped or deferred while unresolved. Do not invent operational values, downgrade source classification to pass validation, or treat a partially resolved draft as approved.
For new and augmented mappings, review all four outline fields against the selected catalog and outline guidance. Require a summary mapping with on_null: error, even if the document defaults to omit. Use a source description or a source-grounded, user-approved {value} template; when no suitable row column exists, use a user-approved constant that truthfully describes every row. Never use a sampled value or filler such as "Unknown". Resolve missing, null, or blank summary sources before considering the mapping complete. Templates can use only the current mapped value, not multiple columns. Leave unsupported target/threat fields unmapped, and document why indicators cannot be populated when no supported observable is available.
An optional saved YAML fragment can add one target:
Augmentation compiles the resulting document with RowMapping before saving. Existing targets require --replace-field; existing output files require --replace. YAML rewriting does not preserve comments/formatting. After augmentation, explicitly use the new output file in subsequent commands.
4. Validate locally and render
The helper compiles through RowMapping and applies saved rows through map_rows. Client schema/configuration checks and per-row mapping failures are not backend acceptance; consult the client reference for scope. The client yields a result for every row and continues after a row error. Errors are saved privately; the helper writes no alert JSONL unless every row succeeds. It never silently drops rows.
Before backend validation, inspect the saved output privately: every alert must have a meaningful, nonblank summary; target/threat must be justified wherever present; and available indicators must be represented as a list. A successful client render alone does not check these semantic requirements or reject blank strings. Fix the YAML or resolve source-data limitations, then rerender; never postprocess the generated outline.
5. Validate the saved output through Howler
Fetch a fresh field snapshot immediately before backend validation, then pass both the pinned and current snapshots:
The helper refuses field-snapshot drift and requires the API and saved field metadata to share the same HTTPS origin. It sends the saved record array to POST /api/v2/ingest/hit/validate (not the create/ingest route), uses a finite timeout, refuses redirects, and saves the full HTTP response privately. Backend validation does not prove write/classification permission or guarantee every future row is valid. Fix the mapping, rerender from the original rows, and validate the new output; never edit generated alerts to obtain a pass.
6. Report the result
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 90 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/howler-row-mapping/SKILL.md
Popularity
- Repository stars
- 54
- Repository forks
- 13
- 7-day trend score
- 0
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/cybercentrecanada/howler/howler-row-mapping)