About JuMP.is_solved_and_feasible

import JuMP, Gurobi
function objf(x, y) return (y - 2)^2/4 - x * y end
B = JuMP.Model(() -> Gurobi.Optimizer());
JuMP.@variable(B, 0 <= x <= 1);
JuMP.@variable(B, 0 <= y);
JuMP.@objective(B, Min, objf(x, y));
JuMP.optimize!(B); # see the following logging
JuMP.solution_summary(B) # see the following printing

Gurobi Optimizer version 12.0.1 build v12.0.1rc0 (win64 - Windows 11.0 (26100.2))

CPU model: 11th Gen Intel(R) Core(TM) i5-1135G7 @ 2.40GHz, instruction set [SSE2|AVX|AVX2|AVX512]
Thread count: 4 physical cores, 8 logical processors, using up to 8 threads

Optimize a model with 0 rows, 2 columns and 0 nonzeros
Model fingerprint: 0x5b406e53
Model has 2 quadratic objective terms
Coefficient statistics:
  Matrix range     [0e+00, 0e+00]
  Objective range  [1e+00, 1e+00]
  QObjective range [5e-01, 2e+00]
  Bounds range     [1e+00, 1e+00]
  RHS range        [0e+00, 0e+00]

Continuous model is non-convex -- solving as a MIP

Found heuristic solution: objective 1.0000000
Found heuristic solution: objective 0.8925000
Presolve removed 0 rows and 2 columns
Presolve time: 0.00s
Presolve: All rows and columns removed

Explored 0 nodes (0 simplex iterations) in 0.00 seconds (0.00 work units)
Thread count was 1 (of 8 available processors)

Solution count 3: -3 0.8925 1 
No other solutions better than -3

Optimal solution found (tolerance 1.00e-04)
Best objective -3.000000000000e+00, best bound -3.000000000000e+00, gap 0.0000%

User-callback calls 90, time in user-callback 0.00 sec

* Solver : Gurobi

* Status
  Result count       : 3
  Termination status : OPTIMAL
  Message from the solver:
  "Model was solved to optimality (subject to tolerances), and an optimal solution is available." 

* Candidate solution (result #1)
  Primal status      : FEASIBLE_POINT
  Dual status        : NO_SOLUTION
  Objective value    : -3.00000e+00
  Objective bound    : -3.00000e+00
  Relative gap       : 0.00000e+00
  Dual objective value : -3.00000e+00

* Work counters
  Solve time (sec)   : 0.00000e+00
  Simplex iterations : 0
  Barrier iterations : 0
  Node count         : 0

I find that JuMP’s solution_summary appears to be seriously incorrect.
As a comparison, Gurobi’s logging is correct:

Optimal solution found (tolerance 1.00e-04)
Best objective -3.000000000000e+00, best bound -3.000000000000e+00, gap 0.0000%

Gurobi’s is correct in that it singled out this vital standalone quantity best bound, which in math sense called “best dual bound”, This quantity is from the dual side, it is not related to any primal side solutions.
However, JuMP.solution_summary did NOT furnish this vital quantity. Or it incorrectly put it in the block entitled Candidate solution (result #1).

The Objective bound associated with Candidate solution (result #1) is nonsensical. (it is not the value 1e100 nonsensical, it is the relationship incorrect.) (Did I express myself well?)