Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Guides you step-by-step through defining a calculated attribute (dimension) on a Honeydew entity. Covers SQL expression building and pushes to Honeydew via the MCP tools.
.claude/skills/hashgraph-online-attribute-creation/SKILL.md| Model | Eval pass | Runs |
|---|---|---|
| gemini-3.6-flash | 100% | 14 |
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | 209% | 0% |
| case-09 | ✓→✗ | ▼ Worse | 44% | 0% |
| case-12 | ✓→✗ | ▼ Worse | -18% | 0% |
| case-15 | ✓→✗ | ▼ Worse | 3% | 0% |
| case-16 | ✓→✗ | ▼ Worse | 151% | 0% |
Before creating attributes, ensure you are on the correct workspace and branch. Use get_session_workspace_and_branch to check the current session context. For development work, create a branch with create_workspace_branch (the session switches automatically). See the model-exploration skill for the full workspace/branch tool reference.
A Honeydew calculated attribute is a virtual, per-row column defined on an entity — analogous to an expression in a SQL SELECT clause. It is evaluated once per row, not aggregated. In BI tools it surfaces as a dimension users can group, filter, and slice by.
Use a calculated attribute when:
net_price, customer_tier, order_month)Do not use a calculated attribute for aggregations across rows — use a metric instead.
entity.field format for all attribute/metric referencesorders.amount, not just amountSee reference.md for: SQL functions, JSON/semi-structured data, geography, data types, full YAML schema, attribute types, time grain, and format strings.
Call create_object with yaml_text:
yamltype: calculated_attribute entity: <entity_name> name: <snake_case_name> display_name: <Human Readable Name> description: |- <business description> owner: <owner_email_or_team> datatype: string|number|float|bool|date|timestamp|time sql: |- <SQL expression> folder: <optional folder path>
Required fields:
type: calculated_attributeentity — the entity this attribute belongs toname — snake_case identifierowner — CRITICAL: always set (email or team name)datatype — CRITICAL: always set explicitlysql — the expressionget_entity or search_model (with search_mode: EXACT) to find the attribute's object_key.update_object with the full updated YAML (yaml_text) and the object_key.> Minimal diff rule: When updating, preserve the existing field order and formatting from the current YAML. Only change the fields you need to modify. Objects are versioned in git, so unnecessary reordering or reformatting creates noisy diffs.
After a successful create_object or update_object call, the response includes a ui_url field. Always display this URL to the user so they can quickly open the object in the Honeydew application.
search_model (with search_mode: EXACT) to find the attribute's object_key.delete_object with that object_key.See examples.md for full worked examples covering: basic, boolean flag, grouping/binning, multi-entity, date truncation, window function, running total, semi-structured JSON, safe division, update, and delete.
Use these MCP tools to explore existing attributes:
get_entity — Get entity details including all attributes (filter by __typename for CalcAttribute or DataSetAttribute)get_field — Get detailed info about a specific attribute by entity and field namesearch_model — Search for attributes across the model by name (use search_mode: EXACT for known names, OR for broad discovery)list_entities — List entities to identify where to anchor new attributesUse the honeydew-docs MCP tools to search the Honeydew documentation when:
reference.md (Snowflake, Databricks, BigQuery differences)Search for topics like: "calculated attributes", "attribute types", "multi-entity attribute", "aggregation attribute", "time grain", "format strings", "advanced modeling".
If a calculated attribute already exists on the entity (or you just created one), reference it by name (entity.attribute_name) rather than inlining its SQL expression. This keeps definitions DRY and ensures changes propagate.
orders.amount, not amount.After creating ANY attribute, you MUST invoke the validation skill to test and validate results.
See validation skill for:
get_data_from_fields (attributes go in the attributes parameter)Quick validation — check distinct values:
Call get_data_from_fields with:
attributes: ["<entity>.<attribute_name>"]metrics: ["COUNT(<entity>.<attribute_name>)"] — forces aggregation, returning one row per distinct valueThis lets you quickly inspect all distinct output values and their frequencies to confirm the attribute logic is correct (see the query skill's "Getting Distinct Values" tip for more details).
amount will fail — write orders.amount.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-10 | fail→fail | 15,202 | 9,879 | -35% | 1 | 1 | 0% | 1,845 | 2,111 | +14% | 0 | 0 | — |
case-01 | fail→fail | 14,156 | 14,464 | +2% | 1 | 1 | 0% | 618 | 1,897 | +207% | 0 | 0 | — |
case-02 | fail→fail | 24,030 | 4,247 | -82% | 1 | 1 | 0% | 652 | 1,984 | +204% | 0 | 0 | — |
case-03 | fail→fail | 6,243 | 8,245 | +32% | 1 | 1 | 0% | 363 | 1,853 | +410% | 0 | 0 | — |
case-04 | fail→fail | 14,793 | 7,573 | -49% | 1 | 1 | 0% | 1,421 | 1,842 | +30% | 0 | 0 | — |
case-11 | fail→fail | 12,343 | 3,110 | -75% | 1 | 1 | 0% | 1,451 | 1,850 | +27% | 0 | 0 | — |
case-05 | fail→pass | 6,254 | 21,989 | +252% | 1 | 1 | 0% | 935 | 2,891 | +209% | 0 | 0 | — |
case-06 | fail→fail | 12,581 | 14,907 | +18% | 1 | 1 | 0% | 1,395 | 1,978 | +42% | 0 | 0 | — |
case-07 | fail→fail | 18,372 | 7,413 | -60% | 1 | 1 | 0% | 549 | 1,827 | +233% | 0 | 0 | — |
case-08 | fail→fail | 6,363 | 4,452 | -30% | 1 | 1 | 0% | 1,122 | 1,880 | +68% | 0 | 0 | — |
case-09 | pass→fail | 13,238 | 4,374 | -67% | 1 | 1 | 0% | 1,341 | 1,936 | +44% | 0 | 0 | — |
case-12 | pass→fail | 16,896 | 15,260 | -10% | 1 | 1 | 0% | 2,502 | 2,041 | -18% | 0 | 0 | — |
case-13 | pass→pass | 6,425 | 9,755 | +52% | 1 | 1 | 0% | 776 | 2,287 | +195% | 0 | 0 | — |
case-14 | fail→fail | 8,697 | 13,083 | +50% | 1 | 1 | 0% | 1,529 | 1,894 | +24% | 0 | 0 | — |
case-15 | pass→fail | 15,578 | 13,908 | -11% | 1 | 1 | 0% | 1,857 | 1,917 | +3% | 0 | 0 | — |
case-16 | pass→fail | 10,114 | 8,175 | -19% | 1 | 1 | 0% | 777 | 1,954 | +151% | 0 | 0 | — |
case-17 | fail→fail | 14,364 | 13,686 | -5% | 1 | 1 | 0% | 3,165 | 1,879 | -41% | 0 | 0 | — |
case-18 | fail→fail | 8,692 | 5,668 | -35% | 1 | 1 | 0% | 1,265 | 1,991 | +57% | 0 | 0 | — |
case-19 | fail→fail | 16,243 | 5,051 | -69% | 1 | 1 | 0% | 1,713 | 1,998 | +17% | 0 | 0 | — |
case-20 | pass→fail | 8,331 | 8,019 | -4% | 1 | 1 | 0% | 1,537 | 1,788 | +16% | 0 | 0 | — |
case-21 | fail→fail | 3,550 | 4,132 | +16% | 1 | 1 | 0% | 432 | 1,801 | +317% | 0 | 0 | — |
case-22 | fail→fail | 12,180 | 4,863 | -60% | 1 | 1 | 0% | 1,845 | 2,093 | +13% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 2 counted toward the lift figure. The other 20 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of -18 percentage points is the difference between those two pass rates over the 2 comparable cases. 7 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.