To formulate a linear programming (LP) model that minimizes the wage bill of the restaurant while adhering to all given constraints, we first need to define our decision variables and then express the objective function and constraints in terms of these variables.

Let's denote:
- \(W\) as the number of waiters.
- \(C\) as the number of cooks.

The objective is to minimize the total wage bill. Given that waiters earn $147 per week and cooks earn $290 per week, the objective function can be written as:
\[ \text{Minimize} \quad 147W + 290C \]

Now, let's formulate the constraints based on the problem description:

1. **Total Staff Constraint**: The restaurant requires a minimum of 50 staff.
\[ W + C \geq 50 \]

2. **Minimum Cooks Constraint**: At least 12 staff members must be cooks.
\[ C \geq 12 \]

3. **Union Regulation Constraint**: The number of cooks should be at least one third the number of waiters.
\[ C \geq \frac{1}{3}W \]

4. **Weekly Wage Bill Constraint**: The total weekly wage bill should not exceed $17,600.
\[ 147W + 290C \leq 17600 \]

5. **Non-Negativity Constraints**: Both the number of waiters and cooks must be non-negative (though, in practical terms, they would also be integers).
\[ W \geq 0 \]
\[ C \geq 0 \]

Given that we're formulating an LP, it's worth noting that while the above formulation captures the essence of the problem, in practice, \(W\) and \(C\) should be integers. However, solving this as an integer linear program (ILP) requires additional specification. For simplicity and adherence to the request for an LP formulation, we'll proceed with the understanding that the solution will provide a lower bound on the minimum wage bill achievable.

Here is how you can represent this problem in Gurobi using Python:

```python
from gurobipy import *

# Create a new model
m = Model("Wage_Bill_Minimization")

# Define variables
W = m.addVar(lb=0, name="Waiters")
C = m.addVar(lb=0, name="Cooks")

# Set the objective function
m.setObjective(147*W + 290*C, GRB.MINIMIZE)

# Add constraints
m.addConstr(W + C >= 50, name="Total_Staff")
m.addConstr(C >= 12, name="Minimum_Cooks")
m.addConstr(C >= (1/3)*W, name="Union_Regulation")
m.addConstr(147*W + 290*C <= 17600, name="Weekly_Wage_Bill")

# Optimize the model
m.optimize()

# Print solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Waiters: {W.x}")
    print(f"Cooks: {C.x}")
    print(f"Wage Bill: ${147*W.x + 290*C.x:.2f}")
else:
    print("No optimal solution found")
```