PLATE 05
Prince of Whales
- ROLE
- Sole developer
- YEAR
- 2023
- STACK
- PHP · JavaScript · MySQL · OpenAI
- AWARD
- Summit Creative Award, Bronze, 2023
BRIEF
A conversational assistant on a whale-watching operator's site. It answers guest questions about tours and wildlife in language the operator supplied, reads the site's current tours and promotions when it loads, and passes the guest through to the booking engine with their selection intact. It is for a visitor choosing a tour, on a subject where how you describe the wildlife is regulated.
DECISION LOG
Compliance at the input, not the output
Transport Canada regulates how wildlife interaction may be described. A generative model will paraphrase its way out of compliance without ever appearing to.
The obvious approach is to check the output. The approach taken was to remove the model's licence to invent in the first place: the client supplied the exact language for regulated topics, and that language became the source of truth the assistant retrieves from and reproduces. Compliance stopped being a filtering problem and became an adherence problem.
Adherence then turned out to be an engineering variable rather than a model-capability one. Getting the assistant to follow supplied wording reliably took iteration on how the instructions were structured, and the structure was tested as XML, as JSON, and as Markdown. XML proved the most reliable in controlled tests. The format the instructions arrive in measurably changes how well they are followed — which is not obvious, and is the kind of thing you only learn by running the comparison rather than assuming the model does not care.
Load the site, not just the knowledge base
When the assistant loads, a script pulls current tour information from the WordPress database. Tours and promotions are read at session start rather than queried per message.
The failure being designed out is not staleness in the abstract — it is the assistant contradicting the page the guest is looking at. A visitor reading a promotion on screen and being told something different in the chat window has been given a reason to distrust both. Front-loading binds the assistant to the site's current state, so the two always agree.
A link, not a handoff
When the assistant cannot help, or a human is asked for, it offers the contact form.
Deliberately unglamorous. There is no live-agent queue, no ticket creation, no routing. Knowing where an automated channel ends matters more than making the ending sophisticated, and a link to a form that a person actually reads is more reliable than an escalation path nobody staffs.
Raw logs, no dashboard
Anonymous conversations are written to a text log, downloadable from the WordPress admin. No analytics database, no reporting interface.
The client gets flexible raw data to use however their own workflows require. Building a dashboard would have meant deciding in advance which questions they were allowed to ask of their own data, and they were better placed to answer that than I was.
The prototype was the pitch
This was 2023, and the stakeholders did not initially understand what was being proposed or why it was worth doing.
No amount of explanation moved that. A working prototype did, immediately. The delivery lesson is the same one as the engineering one on this plate: for something people have no reference point for, the argument is the artefact.
DETAIL PLATES


CONSTRAINT
Wrong wording here is not a quality problem, it is a regulatory one.
That constraint removed paraphrase as an option, and with it the usual reason to reach for a generative model at all. What remained was narrower and harder: an assistant that must sound conversational while reproducing supplied language faithfully, grounded in sources it may not depart from, bounded to a subject it may not leave, and honest enough to hand the guest to a human when it reaches the edge. The interesting engineering was in the constraint, not in the generation.
DELIBERATE BOUNDARIES
Whales and whale-watching tours only
The assistant will not discuss anything else, and does not try to be generally helpful.
No live human escalation
The channel ends at the contact form, by design.