The AI isn't the model. It's the constraint mapping.
Most teams reach for an LLM when they need a constraint solver. The Tapestree timetable engine is a case study in choosing the boring tool.
When a founder says "we want to add AI," they almost always mean one of two things. They want a chat interface, or they want a hard problem to disappear. The second is the interesting one, and it is usually not a job for a large language model.
A timetable is a constraint problem
When we built the timetable engine for Tapestree, the brief was "AI-generated timetables." A naive build reaches for an LLM, feeds it the course list, and asks for a schedule. It will produce something that looks like a timetable and is wrong in ways that take a human a week to find.
The real shape of the problem is constraint satisfaction. A lecturer cannot be in two rooms at once — a hard constraint. A lecturer prefers afternoons — a soft constraint. Students should have minimal gaps — an optimization target. None of that is a language problem. It is a search problem.
```python
Hard constraints reject; soft constraints are scored.
def is_valid(assignment, slot):
if lecturer_busy(assignment.lecturer, slot):
return False # hard: no double-booking
if room_occupied(assignment.room, slot):
return False # hard: one room, one class
return True
def score(schedule):
return (
-student_gap_minutes(schedule) # minimize gaps
- lecturer_preference_bonus(schedule) # honor soft prefs
)
```
- lecturer_preference_bonus(schedule) # honor soft prefs
The first iteration was a constraint-satisfaction algorithm with heuristic search. It generates a clash-free five-day timetable for 800 students in twelve minutes. The previous manual process took three weeks.
Where the LLM actually earned its place
We did use a language model — for the part that is genuinely a language problem. "What rooms are free Thursday at 2pm?" is a natural-language query over structured data. That is a good fit. The scheduling engine underneath it is not.
Reach for the boring tool first. Add the language model where the problem is actually about language.
The lesson generalizes. The phrase "add AI" is a description of a feeling, not a specification. Your job — or your studio's job — is to find the constraint problem hiding underneath it.