CtrlK
BlogDocsLog inGet started
Tessl Logo
SkillPublic

adding-ingestion-warnings

How to add a new ingestion warning type to the event ingestion pipeline. Use when emitting a new warning from nodejs ingestion code (emitIngestionWarning, captureIngestionWarning, pipeline `warnings` arrays, `drop()` with warnings), when adding a warning type, category, or severity, or when a typecheck error says a string is not assignable to IngestionWarningType. Covers the INGESTION_WARNING_TYPES registry (the single source of truth for type, category, and severity), the details-key conventions that ClickHouse v2 materializes into columns, debouncing, and the downstream surfaces to keep in sync (v1 UI map, resolving-ingestion-warnings skill, docs, v2 API).

71

Quality

89%

Does it follow best practices?

Run evals on this skill

Adds up to 20 points to the overall score

View guide
SecuritybySnyk

—

The risk profile of this skill

SKILL.md
Quality
Evals
Security

Quality

Content

81%Weight 40%Scale 1-5

Reviews the quality of instructions and guidance provided to agents. Good implementation is clear, handles edge cases, and produces reliable results.

A strong, highly specific operational guide with clear multi-step workflows, enforced validation via CI drift tests, explicit deploy ordering, and a downstream checklist. The main weaknesses are a missing concrete registry-entry example for the primary nodejs action and very long run-on passages (especially the Rust Kafka configuration) that could be tightened or split into a reference file.

Suggestions

Show a concrete example of one entry in INGESTION_WARNING_TYPES (the file, fields, and shape) so the skill's central action is copy-paste-ready rather than described in prose.

Split the Rust emitting/transport detail (WarningSource constants, fire-and-forget Kafka configuration, env vars and budget constants) into a references/ file linked from a short Rust summary, keeping the nodejs-first workflow lean.

Break up the long run-on bullets (the weld-test paragraph and the fire-and-forget paragraph) into short bullets or a small table of constants vs. what they control.

DimensionReasoningScore

Conciseness

The body is dense with codebase-specific, non-inferable facts (registry mechanics, generated-artifact flow, deploy ordering, ACL rationale) and never explains concepts Claude already knows — no Kafka or ClickHouse tutorials. However, a few passages could be tightened: the capture-produced bullet ("the weld test forces you to pick a route... skew in either direction (flag without an arm, arm without the flag) silently drops warnings in production, so the test makes it a red CI run instead") and especially the fire-and-forget bullet are very long run-on sentences mixing several topics (producer config, budgets, gating, env vars, kafka constants), which is over-explanation relative to the score-5 anchor's "every token earns its place". It clearly sits above the score-3 anchor ("some unnecessary explanation").

4 / 5

Actionability

Concrete throughout: exact file paths, an executable codegen command (`pnpm --filter=@posthog/nodejs gen:ingestion-warning-types`), a copy-adaptable Rust snippet (`Warning::new(WarningType::MyNewType).with_detail(...).into_row(team_id, MY_SERVICE_WARNINGS)`), a details-key-to-column mapping table, and exact constant/function names. The gap keeping it below the score-5 anchor: the central nodejs action — registering a type in `INGESTION_WARNING_TYPES` — is described in prose ("add the type... with `captureProduced: true`") but never shown as a concrete registry-entry example, so the most common edit lacks a copy-paste-ready shape. It comfortably exceeds the score-3 anchor's "pseudocode... missing key details".

4 / 5

Workflow Clarity

Sequences are explicit and ordered: a three-step numbered flow for the common case (register → emit → downstream checklist), a three-step numbered flow for capture-produced types, an explicit rollout-order section ("Deploy the consumer (nodejs) before the producer (Rust capture)") with rationale and a removal reversal, and a downstream checklist. Validation is explicit and enforced: the no-drift CI test with a feedback loop ("rebase, regenerate, recommit") and the Rust weld test that fails CI on route/flag skew. This matches the score-5 anchor ("Clear sequence with explicit validation steps; feedback loops for error recovery; checklists"); the destructive/batch cap does not apply since changes are additive and validation checkpoints are present.

5 / 5

Progressive Disclosure

The body is well-sectioned with clear headers, and every external pointer is a clearly signaled, one-level-deep link to a real repo file (registry, sql_v2.py, serializer.rs module doc, setup.rs constants, the sibling resolving skill's SKILL.md) — no nested reference chains and no bundle files that should have been split out. What keeps it from 5: the skill exceeds 50 lines with no reference files of its own, and the very detailed Rust transport/config material (WarningEmitter envelope shape, WarningSource constants, the entire fire-and-forget Kafka configuration bullet) is inlined where a `references/rust-emitting.md` would keep the nodejs-first path lean — matching the score-4 anchor ("Good structure; most content is appropriately placed; minor organization gaps").

4 / 5

Total

17

/

20

Passed

Description

96%Weight 40%Scale 1-5

Based on the skill's description, can an agent find and select it at the right time? Clear, specific descriptions lead to better discovery.

An excellent description: concrete capabilities, explicit and multi-form "Use when" triggers including the literal typecheck-error phrasing, and third-person voice throughout. The only residual risk is vocabulary overlap with the closely related resolving-ingestion-warnings sibling skill.

DimensionReasoningScore

Specificity

The description names multiple concrete actions and artifacts: "add a new ingestion warning type", "emitting a new warning from nodejs ingestion code (emitIngestionWarning, captureIngestionWarning, pipeline `warnings` arrays, `drop()` with warnings)", plus coverage of "the INGESTION_WARNING_TYPES registry", "details-key conventions that ClickHouse v2 materializes into columns, debouncing, and the downstream surfaces". Coverage spans registering, emitting, materializing, debouncing, and syncing downstream surfaces — comprehensive for the domain, matching the score-5 anchor ("Lists multiple specific concrete actions; comprehensive coverage") rather than the score-4 anchor's "minor gaps in coverage".

5 / 5

Completeness

Both what and when are explicit and concrete: what — "How to add a new ingestion warning type to the event ingestion pipeline... Covers the INGESTION_WARNING_TYPES registry... details-key conventions... debouncing, and the downstream surfaces to keep in sync"; when — "Use when emitting a new warning from nodejs ingestion code... when adding a warning type, category, or severity, or when a typecheck error says...". This matches the score-5 anchor ("Clearly and explicitly answers both what AND when with concrete trigger phrases"); the score-4 anchor requires a 'when' that "could be more explicit", which does not apply here.

5 / 5

Trigger Term Quality

Triggers use the exact identifiers and error text a user or agent would naturally encounter: "emitIngestionWarning", "captureIngestionWarning", "pipeline `warnings` arrays", "`drop()` with warnings", "adding a warning type, category, or severity", and "a typecheck error says a string is not assignable to IngestionWarningType". This includes both function-level synonyms and the literal compiler-error phrasing, matching the score-5 anchor's comprehensive natural-term coverage; nothing relevant appears missing, and it clearly exceeds the score-4 anchor ("a few natural terms missing").

5 / 5

Distinctiveness Conflict Risk

The niche is clear and triggers are add/emit-oriented with exact identifiers ("INGESTION_WARNING_TYPES", "IngestionWarningType"), making wrong-skill firing unlikely. However, a sibling skill ("resolving-ingestion-warnings") covers the adjacent resolving side of the same feature and shares the "ingestion warning(s)" vocabulary, so a generic query about ingestion warnings overlaps both — matching the score-4 anchor ("Mostly distinct; minor overlap risk with closely related skills") better than the score-5 anchor's "minimal conflict risk", since the description does not include a negative boundary (e.g., 'not for resolving existing warnings').

4 / 5

Total

19

/

20

Passed

Validation

87%

Checks the skill against the spec for correct structure and formatting. All validation checks must pass before discovery and implementation can be scored.

Validation — 14 / 16 Passed

Validation for skill structure

CriteriaDescriptionResult

relative_links

Relative link issues: 5 suspicious

Warning

referenced_paths_exist

Referenced path issues: 1 missing

Warning

Total

14

/

16

Passed

Repository

PostHog/posthog

Path

.agents/skills/adding-ingestion-warnings/SKILL.md

Reviewed

Table of Contents

Is this your skill?

If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.