You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Bug #32, surfaced by Vose's own Inputs Outputs.xlsx sample which
declares its output as VoseOutput("Total net revenue from "&B8&"
to "&B23,"$k"). The name is an Excel expression — the runtime
value (e.g. "Total net revenue from 2020 to 2027") only exists
after Excel evaluates the formula.
Our name_parser was treating the leading literal as a full literal
name. The bridge then:
- Passed the partial prefix to the XLL — never matched the cell
- Post-condition looked it up in the .vmrs — never found it
- Raised SimulationFailedError claiming post-phase crashed when
in fact the only issue was name resolution
Fix:
- New ExpressionName type for first-args that prove to be
expressions (literal followed by &, +, etc. rather than , or ))
- Parser detects via what follows the closing quote
- _resolve_vose_name returns the partial prefix with a …
ellipsis marker so list_modelrisk_outputs still surfaces the
cell — just signals "dynamic name" instead of dropping it
- Post-condition verification filters out …-marked names rather
than false-positively failing
Doesn't make the dynamic-name output actually register in the
.vmrs — that's a deeper investigation requiring expression
evaluation. This release is the honesty improvement: don't claim
failure when the sim ran fine.
408 tests pass (+4).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: CHANGELOG.md
+23Lines changed: 23 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -4,6 +4,29 @@ All notable changes to ModelRisk MCP. Follows [Keep a Changelog](https://keepach
4
4
5
5
## [Unreleased]
6
6
7
+
## [0.3.0-alpha.31] — 2026-05-22
8
+
9
+
### Fixed
10
+
11
+
-**Bug #32 — expression-based VoseInput/VoseOutput names false-positive-failed post-condition verification.** Vose's own `Inputs Outputs.xlsx` sample declares its output as `VoseOutput("Total net revenue from "&B8&" to "&B23,"$k")` — the name is an Excel expression, not a static literal. The runtime-evaluated name (e.g. `"Total net revenue from 2020 to 2027"`) is only knowable after Excel computes the formula at simulation time. Our `name_parser` was returning the literal prefix as a `LiteralName` (since it stopped at the closing quote), so:
12
+
- The bridge's `expected_output_names` contained the partial prefix.
13
+
-`run_simulation` passed it to the XLL, which couldn't match it against the actual VoseOutput cell.
14
+
- Post-condition verification looked it up in the produced .vmrs, didn't find it, and raised `SimulationFailedError` — claiming the sim's post-phase had crashed when in fact the only issue was the name-resolution mismatch.
15
+
16
+
Fix:
17
+
- New `ExpressionName` type in `name_parser.py` for first-args that turn out to be expressions (literal followed by `&`, `+`, etc., rather than a closing `,` or `)`).
18
+
- The parser detects this by checking what follows the closing quote.
19
+
-`_resolve_vose_name` returns the partial prefix marked with a `…` ellipsis so `list_modelrisk_outputs` still surfaces the cell with an informational name (`"Total net revenue from …"`) instead of dropping it.
20
+
- Post-condition verification filters out `…`-marked names — we can't statically verify them, so we don't try, rather than failing loudly.
21
+
22
+
### Why this matters
23
+
24
+
Workbooks that build output names from cell content are a real pattern (year-range labels, scenario-specific outputs, anything dynamic). Before alpha.31 every one of those workbooks looked broken to the bridge. The deeper fix — actually evaluating the Excel expression to get the runtime name and registering THAT with the XLL — is a separate larger investigation; this release is the honesty improvement: don't claim failure when the sim ran fine.
25
+
26
+
### Tests
27
+
28
+
408 unit tests pass (+4 in `test_name_parser.py::TestExpressionForm` covering the Vose-sample literal-concat-cellref case, simple `"prefix"&A1`, two-arg literal-with-units, and whitespace tolerance around the closing quote).
0 commit comments