Skip to content

Function metadata: usage examples, documentation URL, parameter descriptions (HF-300)#1705

Open
marcin-kordas-hoc wants to merge 31 commits into
feature/hf-249-function-metadata-apifrom
feature/hf-300-metadata-enrichment
Open

Function metadata: usage examples, documentation URL, parameter descriptions (HF-300)#1705
marcin-kordas-hoc wants to merge 31 commits into
feature/hf-249-function-metadata-apifrom
feature/hf-300-metadata-enrichment

Conversation

@marcin-kordas-hoc

@marcin-kordas-hoc marcin-kordas-hoc commented Jul 13, 2026

Copy link
Copy Markdown
Collaborator

What & why

HF-300 enriches the function-metadata API (getFunctionDetails) so every built-in function returns, in addition to the existing short description and parameter names:

  • a usage example (≥1 per function),
  • a documentation URL — a single shared URL for all functions in v1 (https://hyperformula.handsontable.com/docs/guide/built-in-functions.html), and
  • a short description for each parameter.

Everything is English (translations are a later phase; the structure is already i18n-ready). Extends the SUM/SUMIF exemplar already on the base branch to the whole catalogue (363 functions).

Base: feature/hf-249-function-metadata-api (#1692). Sibling: #1699 (docs single source).

How

  • The single documentation URL is defined once as DEFAULT_DOCUMENTATION_URL in buildFunctionDescriptions.ts and applied as the built-in default — not repeated per function. Custom (user-registered) functions keep ''.
  • examples + per-parameter description authored per category file (categories/*.ts). Parameter counts/names and entry order are unchanged; only bodies were filled.

Testing (in the paired hyperformula-tests PR)

  • Coverage-parity: every listable built-in exposes the shared URL, ≥1 example, and a non-empty description for every parameter.
  • Example-validity: every authored example is built in HyperFormula and asserted not to be a parse (#ERROR!) or unknown-function (#NAME?) error.
  • Existing SUM/SUMIF assertions updated to the .html URL.
  • Arity guard (buildFunctionDetails) stays green across all 363 functions.

Local gates: tsc (src+test) clean · eslint clean · full jest 0 failures · metadata+coverage+example-validity specs pass.

Notes for review

  • No i18n changes — by design. DoD scopes HF-300 to English; no functions are added/renamed, so the 17-language-pack rule does not apply. English-form examples show under every locale for now (accepted "translations later" trade-off).
  • Operators (HF.ADD, …) are listable built-ins, so they get examples/descriptions per the DoD's "each function".
  • Aliases inherit their target's authored doc automatically (resolveFunctionMetadata), so they need no separate authoring.
  • Guide table untouched → the HF-249 bullet 3: generate built-in functions docs from the HF API (single source of truth) #1699 docs drift-check stays green (none of the new fields are rendered in the Function ID/Description/Syntax table).
  • Descriptions describe HyperFormula's actual behavior (verified against the plugins), not Excel where they diverge — e.g. MOD result takes the sign of the dividend, FILTER accepts a single row/column, XNPV's first date is the reference point.

Decisions and citations: ADR in the paired hyperformula-tests repo (adr/2026-07-13-hf300-function-metadata-enrichment.md).

Source: https://app.clickup.com/t/86caprtgj


Note

Low Risk
Documentation and metadata-only changes for the function catalogue API; formula evaluation paths are unchanged aside from richer getFunctionDetails output.

Overview
HF-300 fills out built-in function catalogue metadata so getFunctionDetails() returns usage examples, per-parameter descriptions, and a documentation URL for every built-in (custom functions still get empty strings / empty arrays).

buildFunctionDescriptions now defines DEFAULT_DOCUMENTATION_URL and uses it when a catalogue entry omits documentationUrl, so callers always see the shared built-in-functions guide link instead of ''. Type and builder comments in FunctionDescription.ts are updated to match this “fully authored” catalogue phase.

The bulk of the change is hand-authored examples and non-empty parameters[].description across all categories/*.ts files (363 functions). The hf249-migrate-function-docs script is documented as destructive to those fields if re-run without merge preservation.

SUM/SUMIF no longer set a per-function documentationUrl locally—they rely on the shared default like other built-ins.

Reviewed by Cursor Bugbot for commit 7dbd891. Bugbot is set up for automated code reviews on this repo. Configure here.

marcin-kordas-hoc and others added 17 commits July 13, 2026 12:02
Author examples + per-parameter descriptions manually per category file;
single shared documentationUrl (with .html) centralized as a builder
default; English-only; arity-match constraint; HF behavior as the
semantic oracle. Audit-harness 100% PASS.

Source: https://app.clickup.com/t/86caprtgj
ADR: docs/adr/2026-07-13-hf300-function-metadata-enrichment.md
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… (HF-300)

Source: https://app.clickup.com/t/86caprtgj
ADR: docs/adr/2026-07-13-hf300-function-metadata-enrichment.md
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…manipulation (HF-300)

Source: https://app.clickup.com/t/86caprtgj
ADR: docs/adr/2026-07-13-hf300-function-metadata-enrichment.md
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…se (HF-300)

Source: https://app.clickup.com/t/86caprtgj
ADR: docs/adr/2026-07-13-hf300-function-metadata-enrichment.md
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…nd time (HF-300)

Source: https://app.clickup.com/t/86caprtgj
ADR: docs/adr/2026-07-13-hf300-function-metadata-enrichment.md
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ering (HF-300)

Source: https://app.clickup.com/t/86caprtgj
ADR: docs/adr/2026-07-13-hf300-function-metadata-enrichment.md
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ial (HF-300)

Source: https://app.clickup.com/t/86caprtgj
ADR: docs/adr/2026-07-13-hf300-function-metadata-enrichment.md
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ation (HF-300)

Source: https://app.clickup.com/t/86caprtgj
ADR: docs/adr/2026-07-13-hf300-function-metadata-enrichment.md
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…l (HF-300)

Source: https://app.clickup.com/t/86caprtgj
ADR: docs/adr/2026-07-13-hf300-function-metadata-enrichment.md
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… and reference (HF-300)

Source: https://app.clickup.com/t/86caprtgj
ADR: docs/adr/2026-07-13-hf300-function-metadata-enrichment.md
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…nd trigonometry (HF-300)

Source: https://app.clickup.com/t/86caprtgj
ADR: docs/adr/2026-07-13-hf300-function-metadata-enrichment.md
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… functions (HF-300)

Source: https://app.clickup.com/t/86caprtgj
ADR: docs/adr/2026-07-13-hf300-function-metadata-enrichment.md
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…or (HF-300)

Source: https://app.clickup.com/t/86caprtgj
ADR: docs/adr/2026-07-13-hf300-function-metadata-enrichment.md
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…tical (HF-300)

Source: https://app.clickup.com/t/86caprtgj
ADR: docs/adr/2026-07-13-hf300-function-metadata-enrichment.md
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…HF-300)

Source: https://app.clickup.com/t/86caprtgj
ADR: docs/adr/2026-07-13-hf300-function-metadata-enrichment.md
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Source: https://app.clickup.com/t/86caprtgj
ADR: docs/adr/2026-07-13-hf300-function-metadata-enrichment.md
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…(HF-300)

Accuracy-review findings:
- MOD: result has the sign of the dividend (HF uses JS remainder), not the divisor.
- CEILING/FLOOR: Significance sign requirement is one-directional (only positive Number + negative Significance errors).
- XNPV: the first date is the reference point; other dates must fall on or after it (not the minimum date).
- COUNTBLANK: accepts repeating range/value arguments (repeatLastArgs).
- FILTER: SourceArray must be a single row or column (no 2-D range).
- EVEN/ODD: reworded 'nearest ... away from zero'; ARRAYFORMULA: stronger SUM example.

Source: https://app.clickup.com/t/86caprtgj
ADR: docs/adr/2026-07-13-hf300-function-metadata-enrichment.md
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@qunabu

qunabu commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

Source: https://app.clickup.com/t/86caprtgj
ADR: docs/adr/2026-07-13-hf300-function-metadata-enrichment.md
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Jul 13, 2026

Copy link
Copy Markdown

Performance comparison of head (7dbd891) vs base (2d9196e)

                                     testName |   base |   head | change
------------------------------------------------------------------------
                                      Sheet A | 489.33 | 494.04 | +0.96%
                                      Sheet B | 155.16 |  159.4 | +2.73%
                                      Sheet T | 139.78 | 142.87 | +2.21%
                                Column ranges | 468.35 | 466.55 | -0.38%
Sheet A:  change value, add/remove row/column |  15.27 |   15.1 | -1.11%
 Sheet B: change value, add/remove row/column | 134.52 | 132.15 | -1.76%
                   Column ranges - add column | 142.02 | 149.62 | +5.35%
                Column ranges - without batch | 434.55 | 459.05 | +5.64%
                        Column ranges - batch | 112.65 | 116.42 | +3.35%

marcin-kordas-hoc and others added 9 commits July 13, 2026 15:52
Review findings (prep-flip T5b/T6):
- All 13 category headers said 'parameter descriptions are authored in a later phase' (now authored) and the migration-script overwrite footgun was warned in only one file. Reworded every header to note examples + descriptions are hand-authored and would be overwritten by re-running the generator; mirrored the fix in the generator template.
- Added an explicit overwrite WARNING to scripts/hf249-migrate-function-docs.ts.
- buildFunctionDetails JSDoc no longer claims parameter descriptions are 'empty for functions not yet authored' (contradicted the authored state).

Source: https://app.clickup.com/t/86caprtgj
ADR: docs/adr/2026-07-13-hf300-function-metadata-enrichment.md
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Bare TRUE/FALSE literals are not recognized by HyperFormula (they resolve to
'Named expression TRUE not recognized' → #NAME?), so 51 example formulas across
logical/statistical/information/text would have surfaced an error to any user
running them. Switched to the TRUE()/FALSE() function form, which evaluates.

Source: https://app.clickup.com/t/86caprtgj
ADR: docs/adr/2026-07-13-hf300-function-metadata-enrichment.md
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
MS-Graph Excel cross-check flagged INT(-2.5): HF returns -2 (RoundingPlugin
truncates toward zero for negatives), Excel returns -3 (floors). The parameter
description wrongly said 'round down toward negative infinity' (Excel behavior);
corrected to HF's actual truncate-toward-zero semantics.

Source: https://app.clickup.com/t/86caprtgj
ADR: docs/adr/2026-07-13-hf300-function-metadata-enrichment.md
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…-300)

MS-Graph cross-check surfaced examples that don't evaluate cleanly in a default
engine:
- DATEVALUE: '2020-03-30' (ISO) is not in HF's default dateFormats (DD/MM/YYYY)
  -> #VALUE!; switched to a parseable date.
- MAXA/MINA: a literal text argument yields #VALUE! (text-as-0 applies to ranges,
  not literal args); use numeric+boolean literals instead.

Source: https://app.clickup.com/t/86caprtgj
ADR: docs/adr/2026-07-13-hf300-function-metadata-enrichment.md
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…iew (HF-300)

Review round (sequba + line-by-line + prep-ultra):
- MATCH/VLOOKUP/HLOOKUP: drop the 'HyperFormula skips empty cells when matching
  approximately' claim — that behavior (HF-223 / #1697) is not in this base
  branch, and approximate match returns #N/A on gapped data. Don't overstate.
- INT: shortDescription said 'rounds down' (Excel floor) while the parameter
  description says 'toward zero' — self-contradictory. Reworded to HF's actual
  behavior (integer part, fractional part discarded).
- DATE Year: drop the direct 'Excel' comparison per ADR dec_2 (describe HF
  behavior, not Excel); wording otherwise unchanged.

Source: https://app.clickup.com/t/86caprtgj
ADR: docs/adr/2026-07-13-hf300-function-metadata-enrichment.md
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
hf-developer review: files under docs/ are built + sitemap-indexed by VuePress
(sitemap excludes only /404.html, no citation-strip plugin active), so the ADR's
internal [vrf_/dec_/con_] markers and task IDs would leak as a public page.
Relocate to repo-root adr/ (not built by VuePress, not in the npm files allowlist).

Source: https://app.clickup.com/t/86caprtgj
ADR: adr/2026-07-13-hf300-function-metadata-enrichment.md
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ta-api' into feature/hf-300-metadata-enrichment

# Conflicts:
#	CHANGELOG.md
#	src/interpreter/functionMetadata/categories/array-manipulation.ts
#	src/interpreter/functionMetadata/categories/database.ts
#	src/interpreter/functionMetadata/categories/date-and-time.ts
#	src/interpreter/functionMetadata/categories/engineering.ts
#	src/interpreter/functionMetadata/categories/financial.ts
#	src/interpreter/functionMetadata/categories/information.ts
#	src/interpreter/functionMetadata/categories/logical.ts
#	src/interpreter/functionMetadata/categories/lookup-and-reference.ts
#	src/interpreter/functionMetadata/categories/math-and-trigonometry.ts
#	src/interpreter/functionMetadata/categories/matrix-functions.ts
#	src/interpreter/functionMetadata/categories/operator.ts
#	src/interpreter/functionMetadata/categories/statistical.ts
#	src/interpreter/functionMetadata/categories/text.ts
…(HF-300)

Post-merge with the updated base (snake_case params #1709 + new functions):
- Author XIRR, VSTACK, HSTACK, and fill TBILLEQ/TBILLPRICE 'discount' (base-added).
- Restore examples mis-attached during conflict resolution: SEQUENCE, XNPV, GCD.
- Remove SUM's stale per-function documentationUrl re-introduced by the merge
  (the shared .html default supplies it; comment already said it's absent).

Source: https://app.clickup.com/t/86caprtgj
ADR: adr/2026-07-13-hf300-function-metadata-enrichment.md
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…300)

The base merge restored base's INT shortDescription ('Rounds a number down'),
re-introducing the self-contradiction with the toward-zero parameter description.
Re-apply the HF-accurate 'integer part' wording.

Source: https://app.clickup.com/t/86caprtgj
ADR: adr/2026-07-13-hf300-function-metadata-enrichment.md
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@marcin-kordas-hoc marcin-kordas-hoc marked this pull request as ready for review July 15, 2026 03:41
marcin-kordas-hoc and others added 4 commits July 15, 2026 03:52
Bugbot flagged INT shipping GCD examples (=GCD(24, 36) / =GCD(A1:A5)) —
a valid-but-wrong-function mis-attach introduced during merge
reconciliation. Restore INT's own examples (=INT(8.9) / =INT(-8.9)).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Source: https://app.clickup.com/t/86caprtgj
ADR: adr/2026-07-13-hf300-function-metadata-enrichment.md
…param backticks (HF-300)

- BETA.DIST second example switched from the PDF-with-bounds form
  (=BETA.DIST(2,2,3,FALSE(),0,4) → HF 1.5 vs Excel 0.375, a known engine
  PDF-scaling bug) to the cumulative bounded form (=BETA.DIST(2,2,3,TRUE(),0,4)
  → 0.6875, matches Excel). Still exercises the optional A/B bounds args, but
  no longer ships an example whose output is wrong.
- Removed backticks from six date-and-time PARAMETER descriptions
  (nullDate/dateFormats/timeFormats). The metadata field is plain text and
  every other parameter description in the catalogue is plain prose; backticks
  rendered literally for API consumers. shortDescription markdown links are
  migrated (#1692) content and left untouched.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Source: https://app.clickup.com/t/86caprtgj
ADR: adr/2026-07-13-hf300-function-metadata-enrichment.md
…it (HF-300)

Source-traceability pass over all 366 catalogue entries (descriptions traced
to plugin implementations + docs/guide) found 4 net-new authored parameter
descriptions that over- or mis-stated behavior vs the code:

- POISSON.DIST `mean`: "must be greater than 0" contradicted the typecheck
  (minValue: 0 — mean=0 is accepted and computed). → "must be non-negative".
- GEOMEAN / HARMEAN `number1`: "whose positive values are averaged" implied
  non-positive values are filtered; actually any value <= 0 returns #NUM!.
  → state all values must be positive, else #NUM!.
- SEQUENCE `rows`/`cols`: "must be a literal number ... causes #VALUE!" was
  too narrow (parse-time also accepts numeric-string/unary/boolean literals)
  and unconditional (#VALUE! only when the result spans more than one cell;
  =SEQUENCE(A1) with A1=1 is a 1x1 result, no error). → "resolvable at parse
  time" + qualified #VALUE! condition, matching SequencePlugin's own JSDoc.

The audit found ZERO net-new defects in the other 362 entries; remaining flags
are inherited migrated shortDescriptions (docs/guide-owned), reported separately.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Source: https://app.clickup.com/t/86caprtgj
ADR: adr/2026-07-13-hf300-function-metadata-enrichment.md
The ADR is an internal decision record and doesn't belong in the published
engine package; it now lives in the paired (private) hyperformula-tests repo.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Source: https://app.clickup.com/t/86caprtgj
@marcin-kordas-hoc marcin-kordas-hoc requested a review from sequba July 15, 2026 08:21
@codecov

codecov Bot commented Jul 15, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
⚠️ Please upload report for BASE (feature/hf-249-function-metadata-api@2d9196e). Learn more about missing BASE report.

Additional details and impacted files

Impacted file tree graph

@@                           Coverage Diff                           @@
##             feature/hf-249-function-metadata-api    #1705   +/-   ##
=======================================================================
  Coverage                                        ?   96.86%           
=======================================================================
  Files                                           ?      192           
  Lines                                           ?    15590           
  Branches                                        ?     3447           
=======================================================================
  Hits                                            ?    15102           
  Misses                                          ?      488           
  Partials                                        ?        0           
Files with missing lines Coverage Δ
...nterpreter/functionMetadata/FunctionDescription.ts 100.00% <ø> (ø)
...eter/functionMetadata/buildFunctionDescriptions.ts 100.00% <100.00%> (ø)
.../functionMetadata/categories/array-manipulation.ts 100.00% <ø> (ø)
...nterpreter/functionMetadata/categories/database.ts 100.00% <ø> (ø)
...reter/functionMetadata/categories/date-and-time.ts 100.00% <ø> (ø)
...rpreter/functionMetadata/categories/engineering.ts 100.00% <ø> (ø)
...terpreter/functionMetadata/categories/financial.ts 100.00% <ø> (ø)
...rpreter/functionMetadata/categories/information.ts 100.00% <ø> (ø)
...interpreter/functionMetadata/categories/logical.ts 100.00% <ø> (ø)
...unctionMetadata/categories/lookup-and-reference.ts 100.00% <ø> (ø)
... and 5 more
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

parameters,
repeatLastArgs: metadata.repeatLastArgs ?? 0,
documentationUrl: doc.documentationUrl ?? '',
documentationUrl: doc.documentationUrl ?? DEFAULT_DOCUMENTATION_URL,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't like this default. It may become obsolete easily. Set 'https://hyperformula.handsontable.com/docs/guide/built-in-functions.html' for all functions in FunctionDoc files.

Comment thread CHANGELOG.md
- Added the `getAvailableFunctions()` and `getFunctionDetails()` methods (both static and instance) for retrieving function metadata. [#1692](https://github.com/handsontable/hyperformula/pull/1692)
- Added new functions: VSTACK, HSTACK. [#1698](https://github.com/handsontable/hyperformula/pull/1698)
- Added a new function: `XIRR`. [#1701](https://github.com/handsontable/hyperformula/pull/1701)
- Enriched `getFunctionDetails()` to return a usage example, a documentation URL, and a per-parameter description for every built-in function. [#1705](https://github.com/handsontable/hyperformula/pull/1705)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We don't need separate changelog for it

* descriptions are hand-authored; re-running that script overwrites them.
*/
export const ${constName(category)}: Record<string, FunctionDoc> = {
${body}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Resolve merge conflicts

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants