SurveyJS case study · July 2026

A SurveyJS form can load normally and still hide a question forever.

Valid JSON is not the same thing as valid branching behavior. In one retained public-source SurveyJS definition, a mortgage follow-up existed, the surrounding form could load, and the visibility expression was syntactically accepted—yet no respondent answer could ever make that question appear.

The defect came down to two small text mistakes with large consequences: missing braces turned a field reference into fixed text, and “residential” was misspelled. FormPath proved the supported condition impossible over the choices declared by the definition.

Why the branch is impossible

The rule looks plausible until you ask what it actually reads.

  1. 01

    The first condition can be true

    The definition offers house-purchase as a value for loan-purpose, so the left side of the expression is satisfiable.

  2. 02

    The second condition never reads the form answer

    SurveyJS field references use braces. Because property-use is quoted, the expression compares the literal text “property-use” with another literal string. The respondent's answer is irrelevant.

  3. 03

    The two fixed strings do not match

    property-use is not equal to residental. The latter also misspells the offered value residential. That comparison is always false.

  4. 04

    The whole conjunction stays false

    An and expression cannot become true while one clause is always false. No combination of the listed answers can make the mortgage-status question visible.

The two-line repair

Read the answer, then use the value the definition actually offers.

The important change is not stylistic. Braces make property-use an answer reference; the corrected spelling makes the comparison reachable for the declared choice.

Impossible visibility rule
({loan-purpose} = 'house-purchase') and ('property-use' == 'residental')
Corrected visibility rule
({loan-purpose} = 'house-purchase') and ({property-use} = 'residential')

What the result establishes

A narrow conclusion with inspectable evidence.

  • The target question cannot be shown by the supplied broken rule for any listed answer combination.
  • The report records the rule, assumptions, solver and evaluator versions, and a reduced contradictory guard set.
  • The exact synthetic reproduction is bundled with the browser tool, so anyone can rerun the same defect shape locally.

Evidence boundary

What this case does not claim.

  • It does not claim that SurveyJS Creator generated the rule. The retained repository history does not establish how that JSON was authored.
  • It is a source-level finding about a pinned public definition, not a claim that a currently deployed production form still contains the same rule.
  • It does not show how common branching defects are. The retained review was assembled for validation, not prevalence measurement.
  • It does not certify the rest of the form or cover unsupported triggers, host functions, dynamic panels, or application behavior outside the supplied definition.

No signup · no upload

Try the failure before trusting the explanation.

Load the exact reduced SurveyJS sample, run the analysis in this browser, and inspect the rule, proof, and limits for yourself.

Run the reproduction