ethosteleos.dev

A character forged by its ultimate purpose.

Work|Production · evolving

Skip

A conversation-first recruiting intake agent that turns an unfinished human exchange into a valid structured record without exposing the database to the model.

Skip is the recruit-intake system inside the client platform described here as Northline Recruiting, a made-up name used to protect the client’s identity.

The obvious version of the problem is “replace a form with a chatbot.” That is not the interesting version. The actual problem is that the person on the other end may be fifteen, nervous, answering from a phone, unsure which measurement format the system expects, and entirely willing to leave halfway through a thirty-field form.

Skip makes the conversation the product. Structured data is the byproduct.

It asks one useful thing at a time, follows the recruit’s language, tolerates an incomplete sitting, and resumes later by email. Behind that exchange it builds two related records—a recruit and a player profile—without teaching the language model either table’s name or shape.

Skip architecture map showing natural conversation becoming validated draft state through deterministic code while the model remains separated from the database schema
PLATE 01 Conversation becomes record · semantic tools above, schema and validation below

The model never sees the schema

Skip’s first architecture put the database schema in the prompt and asked an autonomous agent loop to reconstruct state, choose questions, and write the result. It was clever, slow, and responsible for roughly half the bugs in the system.

The live design removes that knowledge from the model.

Tool schemas describe semantic fields: graduation year, position, height, broad jump, contact details. The server owns the mapping from those meanings to tables and columns. The model can ask for and submit “height.” It cannot decide that a value belongs in player_profiles.height_inches, invent a neighboring column, or rewrite a table because the prompt made the structure sound negotiable.

That boundary matters more than prompt quality. A better-behaved model is still untrusted input. A server-side map can be tested, versioned, and refused.

Nothing is written until the person exists

The recruit row is also the resumable session, so partial persistence needs a real identity.

Skip does not create a spray of anonymous half-records as soon as somebody says hello. A gate waits for first name, last name, graduation year, email, and later phone. Once those are present and valid, it creates the recruit with new_lead status and begins applying the rest of the conversation.

There is deliberately no single name column. Identity remains decomposed where it is captured. Resumption is by email. The person can leave and return without the model fabricating continuity from its own transcript.

Persistence is resilient to infrastructure failure. The tool result presented back to the conversation does not become an error monologue merely because a secondary write failed. The system records the failure for a human path while preserving the exchange. That design comes from an earlier Pyris expo where the database had paused, lead-save failed, and the agent still booked real calendar events. A useful agent cannot make one persistence provider the single point at which the human conversation becomes nonsense.

The 9.8-foot jump

One bug explains why the model/database boundary exists better than any diagram.

Skip had been taught to normalize measurements. It saw a 9.8-foot broad jump and helpfully converted the value to 117.6 inches. The target column was an integer.

A naive range check would accept 117.6 as physically plausible. The value is in range. It is still the wrong type and therefore the wrong fact for that field.

The correction lives upstream of the table split: a type-and-range gate rejects a non-integer value for an integer destination by type, regardless of whether the magnitude looks reasonable. The raw answer is quarantined instead of corrupting the row. The model can explain what it thought it heard; it cannot lower the standard of the database to make its conversion fit.

The broader lesson is that plausibility is not validity. An LLM is exceptionally good at producing values that look as though they belong.

Voice is an operating constraint

Skip speaks as a recruit assistant—a capable twenty-year-old intern—not as the company’s owner and not as an omniscient firm representative. The public nickname “Skippy” belongs inside the conversation. The system never quotes prices. The client’s locked Pricing Bible outranks anything the agent, the database, or stale code implies.

That is not merely brand copy. It keeps the agent inside the part of the business process it can safely own. Intake can understand a recruit and build a clean handoff. It cannot negotiate a catalog, improvise money, or borrow the owner’s authority.

What changed between v1 and v2

Skip v1 had thirty-nine questions across seven sections, a questions file, a stage split, schema in the prompt, and an autonomous loop. A typical turn took five to fifteen seconds. A proposed two-model director architecture would have added another intelligence to supervise complexity the system did not need.

Skip v2 killed the structure rather than tuning it. The server took schema knowledge back. Tools became semantic. Validation moved to deterministic gates. The questions became a conversation rather than a form emitted one field at a time.

The difference is visible to the recruit as less machinery. It is visible to the operator as cleaner data and a smaller place for a model to be creatively wrong.

Where it stands

Skip v2.2 is the live behavioral source of truth inside the Northline production application. The former v1 agent loop is dead. The full-page route is live, and an embed route exists for the eventual public-site seam; the August 31, 2026 brief did not claim that the external site button had been verified.

The remaining work is not to make Skip more autonomous. It is to keep narrowing the places where a conversational interpretation can become a database fact without passing a deterministic gate.

That is the project’s governing idea:

Let the machine conduct the conversation. Do not let it define the record.

Provenance

Published
2026-08-31 — generated from commit history, not maintained by hand
Revised
2026-08-31 — 1 revision. Status changes are commits, never a typed field.