Skip to content

HF-131 (1/7): every interpreter cell error carries a message - #1761

Open
marcin-kordas-hoc wants to merge 8 commits into
developfrom
feat/hf-131-error-messages
Open

marcin-kordas-hoc wants to merge 8 commits into
developfrom
feat/hf-131-error-messages

Conversation

@marcin-kordas-hoc

@marcin-kordas-hoc marcin-kordas-hoc commented Sep 10, 2026 •

Copy link
Copy Markdown
Collaborator

Context

The PR makes every cell error built inside the interpreter carry a message that states its cause. It is part 1 of 7 of HF-131 (#1761 → #1767).

  • Why: 77 new CellError(...) calls in 15 files under hyperformula/src/interpreter/ passed no message, so DetailedCellError.message was '' for errors such as =1/0.
  • What changed:
  • Result: =1/0 reports Division by zero. and =NA() reports The NA function always evaluates to the #N/A error. The error types do not change.

The public CellError constructor is unchanged: message stays optional for custom functions.

How did you test your changes?

  • Paired tests: handsontable/hyperformula-tests#59 on feat/hf-131-error-messages. It adds unit/error-messages.spec.ts and message assertions to the RATE, SKEW, SKEW.P and TTEST specs.
  • error-messages.spec.ts with the RATE, SKEW and TTEST specs: 39 tests pass against this head; all 4 suites fail against develop, where the new constants do not exist.
  • The lint rule fires: a bare new CellError(ErrorType.DIV_BY_ZERO) and one with an explicit undefined message in ModuloPlugin.ts each produce a no-restricted-syntax error.
  • CI is green on this head, except the repository-wide FOSSA license check.

Compatibility with Excel and Google Sheets

Not applicable: the error types and the displayed values (#DIV/0!, #NUM!, #N/A, #VALUE!) do not change. Only the message text does.

Public API changes

None to signatures. DetailedCellError.message is now non-empty for these 77 errors.

Out of scope and follow-ups

Types of changes

  • Breaking change (existing functionality no longer works as before) – agreed with the maintainers
  • New feature or improvement (a non-breaking change that adds functionality)
  • Bug fix (a non-breaking change that fixes an issue)
  • Additional language file, or a change to an existing language file (translations)
  • Change to the documentation

Related issues

  1. Part of Improve the formula error messages #1547 (HF-131).

Checklist

marcin-kordas-hoc and others added 2 commits September 7, 2026 16:46
Fills in all 78 call sites in src/interpreter/ that constructed a CellError
with no message, so a consumer no longer receives a bare #DIV/0! or #NUM! with
an empty message string.

Ten new catalogue entries in src/error-message.ts, not 78: the 46
division-by-zero sites share one ErrorMessage.DivisionByZero, and the 26 NUM
sites mostly reuse entries that already existed (ValueLarge, ValueSmall,
NotHex, NaN, BadMode, ComplexNumberExpected and others). New entries were added
only where nothing existing was accurate -- NoBroadcastValue,
SearchRangeDimension, NaFunction, TwoCashFlows, PositiveAndNegative,
NonZeroPeriods, NoConvergence, RateGuess, MaturityLong.

No error type changes and no signature changes; ArithmeticHelper.ts gains only
a message literal inside divide(). Nothing under src/i18n/ is touched -- this
slice is English-only by an explicit product decision.

Produced by a prep-ship (`spec-to-ship`) run: `prep-ship ship hf131-messages
--task-file ... --yes`. The run authored its acceptance specs first, then
iterated implementation against them. It was killed by a process restart
before reaching its own commit step, so this commit was made by hand from the
work it left in the worktree, after verifying it:

- 78 message-less sites -> 0, counted with the same command the task file gave.
- tsc --noEmit and eslint --quiet both clean.
- Full private suite: 5 failed / 6165 passed / 6173 total, against a baseline
  of 5 failed / 6157 passed / 6165 total. The 5 are a pre-existing test-repo
  branch-pinning mismatch, unrelated. The +8 are the run's own new specs, all
  passing.
- The run also updated three pre-existing specs whose expectations had gone
  stale (error-address-preservation, arrays, matrix-plugin). Checked each: it
  added the message argument to detailedErrorWithOrigin, which strengthens
  those assertions rather than weakening them -- they still compare the
  address, and now the message too, via catalogue constants. No test was
  loosened to reach green.

The ESLint rule that would stop a message-less CellError being reintroduced is
deliberately NOT here: the harness commits only src, docs and CHANGELOG.md, so
an .eslintrc.js change would have been silently dropped. It needs its own step.

Test-side changes live in the private repo and are not part of this commit.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Enforces the guarantee this PR's message-filling work establishes: a
message-less new CellError(...) construction under src/interpreter/ is now
a lint error. Two selectors — a bare one-argument call, and an explicit
literal undefined as the second argument (the exact shape the two CYCLE
sites in src/Evaluator.ts still use; Evaluator.ts is outside src/interpreter/
so this rule doesn't reach them yet, and is unaffected by this commit).

Verified: 0 lint errors on the full src/ tree (same pre-existing warning
count as before this commit — no new warnings). The rule was proven to
actually fire, not just parse, by temporarily reverting one src/interpreter/
plugin site to a bare 'new CellError(ErrorType.NUM)', observing the expected
lint error, then restoring it (git diff empty afterward).

Widened to all of src/ in the next PR in this stack
(feat/hf-131-error-messages-outside-interpreter).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@qunabu

qunabu commented Sep 10, 2026

Copy link
Copy Markdown
Contributor

@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Sep 10, 2026 •

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Preview URL Updated (UTC)
✅ Deployment successful!
View logs
hyperformula-docs 7673ddf Commit Preview URL

Branch Preview URL
Oct 23 2026, 07:17 AM

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes using default effort and found 2 potential issues.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 84708e2. Configure here.

Comment thread CHANGELOG.md Outdated
Comment thread hyperformula/.eslintrc.js
…messages

# Conflicts:
#	CHANGELOG.md
#	src/error-message.ts
#	src/interpreter/plugin/ConditionalAggregationPlugin.ts
#	src/interpreter/plugin/ModuloPlugin.ts
@github-actions

github-actions Bot commented Sep 11, 2026 •

Copy link
Copy Markdown

Performance comparison of head (7673ddf) vs base (d143456)

                                     testName |    base |    head |  change
---------------------------------------------------------------------------
                                      Sheet A |  503.56 |  505.06 |  +0.30%
                                      Sheet B |  165.12 |  163.49 |  -0.99%
                                      Sheet T |  147.02 |  143.08 |  -2.68%
                                Column ranges |  475.75 |  475.37 |  -0.08%
                                Sorted lookup | 14188.9 | 14370.6 |  +1.28%
Sheet A:  change value, add/remove row/column |   17.48 |   14.73 | -15.73%
 Sheet B: change value, add/remove row/column |  148.39 |  142.46 |  -4.00%
                   Column ranges - add column |  159.98 |  152.48 |  -4.69%
                Column ranges - without batch |  491.17 |  486.78 |  -0.89%
                        Column ranges - batch |  126.29 |  120.28 |  -4.76%

marcin-kordas-hoc and others added 2 commits September 11, 2026 05:30
No engine changes -- the paired hyperformula-tests branch for this PR
gained 4 new coverage-closing test cases after the initial CI run, and
re-running the same commit isn't possible; this empty commit forces a
fresh run so codecov/patch reflects them.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
HF-131 is a ClickUp id; GitHub #131 is an unrelated, closed issue about array
type support. The work this stack does is tracked by #1547.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

@Tobiadefami Tobiadefami left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Looks good. Verified the added error messages and that the lint rule rejects both missing messages and explicit undefined.

marcin-kordas-hoc and others added 3 commits October 22, 2026 15:23
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts:
#	CHANGELOG.md
#	hyperformula/src/error-message.ts
#	hyperformula/src/interpreter/plugin/DatabasePlugin.ts
#	hyperformula/src/interpreter/plugin/NumericAggregationPlugin.ts
…s point

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@codecov

codecov Bot commented Oct 23, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 98.86364% with 1 line in your changes missing coverage. Please review.
✅ Project coverage is 97.31%. Comparing base (d143456) to head (7673ddf).

Files with missing lines Patch % Lines
...rformula/src/interpreter/plugin/FinancialPlugin.ts 97.29% 1 Missing ⚠️
Additional details and impacted files

Impacted file tree graph

@@             Coverage Diff             @@
##           develop    #1761      +/-   ##
===========================================
+ Coverage    97.28%   97.31%   +0.03%     
===========================================
  Files          207      207              
  Lines        16218    16229      +11     
  Branches      3556     3588      +32     
===========================================
+ Hits         15777    15794      +17     
+ Misses         433      427       -6     
  Partials         8        8              
Files with missing lines Coverage Δ
hyperformula/src/error-message.ts 100.00% <100.00%> (ø)
hyperformula/src/interpreter/ArithmeticHelper.ts 98.67% <100.00%> (ø)
hyperformula/src/interpreter/Interpreter.ts 95.39% <100.00%> (ø)
...performula/src/interpreter/plugin/ComplexPlugin.ts 100.00% <100.00%> (ø)
...interpreter/plugin/ConditionalAggregationPlugin.ts 100.00% <100.00%> (ø)
...erformula/src/interpreter/plugin/DatabasePlugin.ts 94.97% <100.00%> (ø)
...ormula/src/interpreter/plugin/InformationPlugin.ts 93.33% <100.00%> (ø)
...yperformula/src/interpreter/plugin/LookupPlugin.ts 97.26% <100.00%> (ø)
hyperformula/src/interpreter/plugin/MathPlugin.ts 100.00% <100.00%> (ø)
...yperformula/src/interpreter/plugin/ModuloPlugin.ts 100.00% <100.00%> (ø)
... and 6 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.

This branch has not been deployed

No deployments
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