To solve this problem, we first need to understand and translate the given natural language description into a symbolic representation. This involves identifying variables, the objective function, and constraints.

Given:
- Variables: 'hours worked by Bobby' and 'hours worked by Peggy'
- Objective Function: Maximize `1 * hours worked by Bobby + 1 * hours worked by Peggy`
- Constraints:
  1. Total combined work quality rating from hours worked by Bobby plus hours worked by Peggy ≥ 6
  2. Total combined organization score from hours worked by Bobby plus hours worked by Peggy ≥ 10
  3. `-1 * hours worked by Bobby + 6 * hours worked by Peggy ≥ 0`
  4. Total combined work quality rating ≤ 13
  5. Total combined organization score ≤ 31
  6. Hours worked by Bobby must be non-fractional (integer)
  7. Hours worked by Peggy can be non-integer

Symbolic Representation:
Let `x0` represent 'hours worked by Bobby' and `x1` represent 'hours worked by Peggy'.

The objective function is to maximize: `1*x0 + 1*x1`

Constraints:
1. `4*x0 + 5*x1 ≥ 6`
2. `2*x0 + 8*x1 ≥ 10`
3. `-1*x0 + 6*x1 ≥ 0`
4. `4*x0 + 5*x1 ≤ 13`
5. `2*x0 + 8*x1 ≤ 31`

Since 'hours worked by Bobby' must be an integer and 'hours worked by Peggy' can be a non-integer, we have:
- `x0` is an integer variable
- `x1` is a continuous variable

```json
{
  'sym_variables': [('x0', 'hours worked by Bobby'), ('x1', 'hours worked by Peggy')],
  'objective_function': 'maximize 1*x0 + 1*x1',
  'constraints': [
    '4*x0 + 5*x1 >= 6',
    '2*x0 + 8*x1 >= 10',
    '-1*x0 + 6*x1 >= 0',
    '4*x0 + 5*x1 <= 13',
    '2*x0 + 8*x1 <= 31'
  ]
}
```

Now, let's implement this problem using Gurobi Python:

```python
from gurobipy import *

# Create a model
m = Model("Work Hours Optimization")

# Add variables
x0 = m.addVar(vtype=GRB.INTEGER, name="hours_worked_by_Bobby")
x1 = m.addVar(vtype=GRB.CONTINUOUS, name="hours_worked_by_Peggy")

# Set objective function
m.setObjective(1*x0 + 1*x1, GRB.MAXIMIZE)

# Add constraints
m.addConstr(4*x0 + 5*x1 >= 6, "work_quality_rating_min")
m.addConstr(2*x0 + 8*x1 >= 10, "organization_score_min")
m.addConstr(-1*x0 + 6*x1 >= 0, "peggy_bobby_ratio")
m.addConstr(4*x0 + 5*x1 <= 13, "work_quality_rating_max")
m.addConstr(2*x0 + 8*x1 <= 31, "organization_score_max")

# Optimize the model
m.optimize()

# Print results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Hours worked by Bobby: {x0.x}")
    print(f"Hours worked by Peggy: {x1.x}")
    print(f"Objective function value: {m.objVal}")
else:
    print("No optimal solution found")
```