validation
Skill43 starsChanged 7 months agoApache-2.0View on GitHub
Use after creating or modifying ANY Honeydew object (metric, attribute, entity, domain). Provides type-specific validation logic to ensure objects work correctly and return sensible results.
20 other projects use a version of this.
Adopted by
Most recently taken up by
- thistleknot/skillstheir own version, first seen Nov 8, 2026
- GoogleCloudPlatform/cloud-solutionstheir own version, first seen Nov 8, 2026
- LeanMeanCleanApps/CleanModelContextProtocoltheir own version, first seen Nov 8, 2026
- AnyOrgName/php-skillstheir own version, first seen Nov 8, 2026
- ruujOnChain/HedgeFund-Skillstheir own version, first seen Nov 8, 2026
- aibtcdev/skillstheir own version, first seen Oct 26, 2026
Used with
Projects with it also use testing.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
NVIDIASkilltesting
Run Python and Rust tests for physicsnemo-curator using uv + pytest with coverage reporting via pytest-cov, and cargo-nextest for Rust tests. Includes benchmark workflows with pytest-benchmark and criterion.
Also in 3 projects that use this
Other versions20 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 20
- openai/codex-security★ 11ksame name
- openai/plugins★ 7.8ksame name
- GoogleCloudPlatform/cloud-solutions★ 139same name
- richard-kim-79/archora-skills★ 49same name
- wolverin0/claude-skills★ 41same name
- loocor/mcpmate★ 35same name
- ruujOnChain/HedgeFund-Skills★ 17same name
- aibtcdev/skills★ 11same name
- AnyOrgName/php-skills★ 4same name
- jkaninda/okapi-skills★ 3same name
10 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository13 other files it gives its agents.
- AGENTS.mdAGENTS.md
- attribute-creationSkill
- context-item-creationSkill
- conversation-reviewSkill
- domain-creationSkill
- entity-creationSkill
- filteringSkill
- metric-creationSkill
- model-explorationSkill
- query-debuggingSkill
- querySkill
- relation-creationSkill
- workspace-branchSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
17 rules. 0 are common, 10 are distinctive, and 7 are very specific to this project.
0
Common
Most of the 20 edited versions we read keep these.
10
Distinctive
This author's own choices. Worth a look.
7
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 29
If the tool call fails (API error, permission denied, timeout), report the error to the user before proceeding.
- Distinctive: line 43
If the new metric is a filtered subset of an existing metric, or a ratio of existing metrics, query them together to verify consistency:
- Very specific: line 48
Call get_data_from_fields with both metrics:
- Very specific: line 65
If the attribute references a related entity (multi-entity attribute), first verify the relation exists using get_entity on the source …
- Distinctive: line 66
If the relation is missing, report that before attempting to query the attribute.
- Distinctive: line 92
All values are NULL or >50% NULLs
- Very specific: line 103
Use list_entities and filter results for the new entity name.
- Very specific: line 136
Use get_entity on the source entity and check its relations list for the new relation.
- Very specific: line 140
Call get_data_from_fields with a cross-entity query:
- Distinctive: line 159
All joined values are NULL (bad join condition)
- Very specific: line 167
Use search_model (with search_mode: EXACT) to find the new domain by name.
- Very specific: line 171
Call get_data_from_fields with the domain parameter to verify entities are accessible and filters apply:
- Distinctive: line 178
If the domain has semantic or source filters, compare results with and without the domain to confirm filters reduce the data as expected:
- Distinctive: line 205
When modifying an existing object, compare before and after:
- Distinctive: line 217
If a tool call fails, distinguish between:
- Distinctive: line 231
When results seem wrong, report to the user with:
- Distinctive: line 237
Do not silently fix issues — always surface findings and ask before making changes.
“Common” is measured: kept by at least 6 in 10 of the 20 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Overview
This skill is MANDATORY after creating or modifying any Honeydew object.
Validation ensures:
- The object compiles and executes without errors
- Results are returned (not NULL or empty)
- Values make business sense
- Related objects are consistent with each other
Validation by Object Type
Metrics
Step 1: Execute the metric
Call get_data_from_fields with:
metrics:["<entity>.<metric_name>"]
If the tool call fails (API error, permission denied, timeout), report the error to the user before proceeding. Do not confuse a tool error with suspicious data.
Step 2: Sanity checks
| Check | What to Look For | Action if Failed |
| Returns data | Not NULL, not empty | Check SQL syntax, entity references |
| Magnitude | Reasonable for business context | Verify calculation logic |
| Sign | Positive for revenue/counts (usually) | Check for inverted logic |
| Related metrics | Parts sum to whole | Query related metrics together and verify consistency |
| Ratios | Between 0-100% (usually) | Check numerator and denominator metrics independently |
Step 3: Cross-validation
If the new metric is a filtered subset of an existing metric, or a ratio of existing metrics, query them together to verify consistency:
- For filtered metrics: query the filtered metric alongside the unfiltered total — the filtered value should be less than or equal to the total.
- For ratio/derived metrics: query the numerator and denominator independently to confirm they return sensible values before checking the ratio.
Call get_data_from_fields with both metrics:
metrics:["<entity>.<filtered_metric>", "<entity>.<total_metric>"]
Alert user if:
- Metric returns $0 or NULL unexpectedly
- Revenue/count is negative
- Ratio exceeds 100% or is negative (unless expected)
- Magnitude seems off by orders of magnitude
Attributes
Step 1: Execute the attribute
If the attribute references a related entity (multi-entity attribute), first verify the relation exists using get_entity on the source entity.
If the relation is missing, report that before attempting to query the attribute.
Sample rows — call get_data_from_fields with:
attributes:["<entity>.<attribute_name>"]
For boolean attributes, check distribution — call get_data_from_fields with:
attributes:["<entity>.<boolean_attribute>"]metrics:["<entity>.count"]
Step 2: Sanity checks by attribute type
| Attribute Type | Valid Range | Red Flags |
| Age/Duration | 0 to reasonable max | Negative values, >150 years |
| Boolean | TRUE/FALSE mix | All TRUE or all FALSE |
| Percentage | 0-100 (usually) | Negative, >100 (unless growth rate) |
| Date | Past to near future | Year 1900, year 2099, all NULLs |
| Category/Bucket | Expected labels | 95%+ in "Unknown" or NULL |
| Rank | Starts at 1, consecutive | Starts at 0, gaps, all same value |
| Running total | Monotonically increasing | Decreases, resets unexpectedly |
| Any type | Mix of values | >50% NULLs warrants investigation |
Alert user if:
- All values are NULL or >50% NULLs
- Boolean is 100% one value
- Dates are invalid or in wrong century
- Buckets are mostly "Unknown"
Entities
Step 1: Verify entity was created
Use list_entities and filter results for the new entity name.
Step 2: Verify data flows
Call get_data_from_fields with:
metrics:["<entity>.count"]
Also call with a list of attributes to verify they are accessible:
attributes:["<entity>.<attribute1>", "<entity>.<attribute2>", "<entity>.<attribute3>"]
Step 3: Sanity checks
| Check | What to Look For | Action if Failed |
| Entity exists | Shows in list_entities results | Check create_entity call |
| Has rows | Count > 0 | Verify source table path |
| Key is unique | Count = count distinct of key | Fix key or add composite key |
| Attributes accessible | Can query attributes | Check dataset definition |
Alert user if:
- Entity not found after creation
- Zero rows returned
- Key column has duplicates (for non-fact tables)
Validating Relations (part of entity validation)
Relations are not standalone objects — they are defined within an entity's YAML. Validate them as part of the entity that contains them.
Step 1: Verify relation exists
Use get_entity on the source entity and check its relations list for the new relation.
Step 2: Test the join works
Call get_data_from_fields with a cross-entity query:
attributes:["<target_entity>.<attribute>"]metrics:["<source_entity>.<metric>"]
Step 3: Sanity checks
| Check | What to Look For | Action if Failed |
| Relation exists | Shows in get_entity results | Check update_object call |
| Join works | Cross-entity query succeeds | Verify join keys match |
| No fan-out | Counts don't explode | Check cardinality (many-to-one vs many-to-many) |
| NULLs reasonable | Some NULLs OK for left join | Too many NULLs = bad join key |
Alert user if:
- Relation not found on the entity
- Cross-entity query fails
- Row count explodes (indicates wrong cardinality)
- All joined values are NULL (bad join condition)
Domains
Step 1: Verify domain exists
Use search_model (with search_mode: EXACT) to find the new domain by name.
Step 2: Test with a scoped query
Call get_data_from_fields with the domain parameter to verify entities are accessible and filters apply:
metrics:["<entity>.count"]domain:"<domain_name>"
Step 3: Verify filters apply
If the domain has semantic or source filters, compare results with and without the domain to confirm filters reduce the data as expected:
- Query a metric with the domain set — note the result.
- Query the same metric without the domain — note the result.
- The domain-scoped result should be less than or equal to the unscoped result (for filters that restrict rows).
Step 4: Sanity checks
| Check | What to Look For | Action if Failed |
| Domain exists | Found via search_model | Check create_object call and YAML syntax |
| Entities accessible | Scoped query returns data | Verify entity names match existing entities |
| Filters apply | Scoped count <= unscoped count | Check filter SQL and entity.field references |
| Field selectors work | Excluded fields not returned in query | Verify selector patterns and order |
| No errors | Query executes without compilation errors | Check filter SQL syntax, fully qualified refs |
Alert user if:
- Domain not found after creation
- Scoped query returns an error (likely bad filter SQL or missing entity)
- Filters have no effect (scoped count equals unscoped count when a filter is expected to reduce rows)
- Excluded fields are still accessible (field selector not applied correctly)
Validating Updates (update_object)
When modifying an existing object, compare before and after:
- Before altering, query the object and note the current result.
- After altering, query again and compare.
- Report the difference to the user: "The metric
revenuechanged from$1,234,567to$1,198,432after applying the discount logic."
This confirms the change had the intended effect and helps catch unintended regressions.
Error Handling
If a tool call fails, distinguish between:
| Situation | Meaning | Action |
| Tool returns an error | API error, permission denied, timeout, invalid YAML | Report the error message to the user. Do not treat as a validation failure — the object may not have been created. |
| Tool returns empty/NULL data | Object was created but returns no results | Proceed with sanity checks — likely a data or SQL issue. |
| Tool returns unexpected values | Object works but results look wrong | Report findings and ask user before attempting a fix. |
To investigate a query that failed earlier — or to see how the same object behaves across other clients (BI tools, scheduled jobs) — use
list_query_historyto pull the failed execution's error, semantic YAML, and compiled SQL. See the query-debugging skill.
Alerting Guidelines
When results seem wrong, report to the user with:
- The actual value returned by the query
- Why it looks suspicious (e.g., negative revenue, 100% NULL, row count doubled)
- A suggested next step (e.g., "Should I check the SQL expression?" or "Should I verify the join keys?")
Do not silently fix issues — always surface findings and ask before making changes.
Quick Reference
| Object | Execute With | Key Checks |
| Metric | get_data_from_fields with metrics list | Value, magnitude, sign, consistency |
| Attribute | get_data_from_fields with attributes list | Range, distribution, NULLs |
| Entity | list_entities + get_data_from_fields | Exists, has rows, key unique |
| Relation | get_entity + cross-entity field query | Exists, joins work, no fan-out (validated as part of entity) |
| Domain | search_model + get_data_from_fields with domain | Exists, filters apply, fields scoped |
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

