hosette.
← Back to projects

2026 · legal-tech · AI assistant · construction

Celine AI

An experiment: lien-rights chat for suppliers and equipment lessors: information, not advice, even when it knows your account

Role
Product manager, discourse designer, lien-rights expert
Stack
Next.js 16React 19FastifyAnthropic SDKPostgreSQLRedisBullMQ
Celine AI: An experiment: lien-rights chat for suppliers and equipment lessors: information, not advice, even when it knows your account
The chat in account context. Five recent deliveries, none of them in Canada, all named back with project, customer, and ticket. The assistant doesn't tell the user what to do; it lays the account out so the question gets specific before it gets answered.

In plain terms: a chat that answers construction payment-rights questions by naming the relevant statute, naming your account state, and stopping short of telling you what to do.

Status
wireframe
Scope
26 jurisdictions
Languages
EN · FR
Hard part
info ≠ advice

why

Seven years at Levelset and Procore, same questions every week: do I need a preliminary notice in Texas, what’s my exposure on this delivery, did this waiver actually waive anything? Every answer came from two places — the customer’s account state, and a thicket of state-by-state statutory rules.

Celine is the experiment that asked the harder version: can a chat stay on the information side of the line when it already knows your account? A bot reciting Texas Property Code §53.057 is clearly information. The same bot saying you missed your preliminary notice deadline on the Smith job — same statute, applied to your account — is that still information? The line is one verb wide, and that’s the whole project.

The wireframe scopes to North America because that’s the market reality: US contractors take jobs in Canada, Canadian sub-trades come south. I knew US lien law cold but not Canadian lien law — so the Canadian half ran its own test inside the first one: does statutes-as-context carry a non-expert into a jurisdiction they can’t verify from memory? That turned out to be the more transferable question.

Celine is half homage to Zlien (Levelset’s original name) and half homophone of Céline Dion, who anchors the French-Canadian side of the scope. Naming the assistant after a person also tilts the register: I’d ask Celine and I’d run that by Celine frame the chat the way it should be framed — as a knowledgeable colleague, not a verdict machine.

what I built

A wireframe of a streaming chat with EN/FR toggle. Account state and statutes both live in the system prompt — no retrieval store, no rules engine, no Postgres behind the wireframe. Context only.

Four starter questions, each testing a different shape: What deadlines are coming up? (pull from account state), Do I need a preliminary notice in Texas? (recall a specific statute), Explain conditional vs. unconditional waivers (explain a legal distinction), What are my unprotected receivables? (run a portfolio query). If the chat answered all four from context alone and stayed on the information side of each, the experiment was a yes.

French isn’t a translation layer here. Quebec’s civil-law framework — CCDC declarations, provincial holdbacks — is a genuinely different rules surface from the US AIA-waiver world, so both had to ship as parallel rule surfaces.

Celine AI breaking down pay-if-paid vs pay-when-paid clauses in two side-by-side cards, with state-by-state enforceability spectrum below
The conceptual-explanation shape. Two cards juxtaposed, then a jurisdictional spectrum, then the descriptive close.

decisions I’d defend

Account-aware first. The interesting test was never can a model recite lien law — that’s been answerable since GPT-3. It was whether the model could hold your account state in one hand and the statutes for your jurisdictions in the other and answer about this week’s exposure. Whether that holds at production scale is exactly what a wireframe can’t tell you.

Celine AI summarizing $2.27M in receivables with expired statutory deadlines across Texas, California, Ontario, and Florida, with statutes cited inline in a four-row table
The portfolio shape. Statutes carry the line: every figure has a code section attached, so the speaker is the rule, not Celine.

Four moves that keep it information, not advice. Show the rule and the account state separately; answer should I with what the statute says + what your account shows; cite the statute inline on every account-aware answer so the speaker is always the named source, never Celine; forbid prescriptive verbs (you’ll want to, the safe move is) by name in the system prompt. Those four constraints are simple enough to state in two sentences and load-bearing enough that the chat stayed descriptive across all four question shapes.

North American first, Spanish flagged. 22 US states + 4 Canadian provinces (Alberta, BC, Ontario, Quebec), EN and FR. The Canadian inclusion tested whether statutes-as-context carries a non-expert — it did, as far as a wireframe can tell. Spanish is the real missing piece for production.

The North American scope: a card summarizing 22 US states under common law and English, then four cards for Alberta, British Columbia, Ontario, and Quebec, each with its construction-payment statute. Quebec is visually distinct, marked in French and civil law for its Civil Code legal hypothec regime. Bottom totals: 26 jurisdictions, 2 languages, 2 legal traditions.
The scope on one page. Quebec is the hard case: civil law, French, and a hypothec regime that doesn't translate into the lien-waiver world the US side runs on.

Four welcome questions, very on purpose. Cold-start chat fails when users don’t know what to ask. The four suggestions are the four shapes Celine handles best — temporal, jurisdictional, conceptual, portfolio. A fifth would have read as a menu.

the prompt as discourse

The four constraints look like policy rules; they’re speech-act rules. Information describes a state of affairs. Advice commits the speaker to a position. Cross the line and the chatbot has done something, not reported something.

Three techniques do most of the work: replace you should with the options that generally exist include (same proposition, different speech act); set the statute and the account state side by side with no connective so the reader does the inferring; cite the statute inline on every account-aware answer so any claim has a named source, never Celine.

The clearest version is a worked teaching pair in the system prompt, same facts, different discourse:

WRONG: California’s deadline is 90 days from last furnishing, so you have 5 days left.

RIGHT: Under California Civil Code § 8412, the general deadline to record a mechanics lien is 90 days after completion of the work of improvement. If a notice of completion has been recorded, the deadline may be shortened to 30 days for claimants other than direct contractors (§ 8414). The calculation depends on what constitutes “completion” and whether a notice of completion was recorded. Given potential time sensitivity, contact a California construction attorney immediately.

The wrong version ends in a bare assertion. The right version is descriptive, hedged, sourced inline, and closes by handing the specific question back to a human authority. Same legal information, different speech act. Prompt engineering for serious domains is a linguistics problem first, a software problem second.

A vertical ladder of utterance types about lien rights, ordered by increasing illocutionary force. From the bottom: pure citation, citation plus account, conditional application, then a dashed line marked the information / advice line, then bare assertion and directive at the top. The system prompt holds the model below the dashed line.
Five rungs the model is asked to occupy, and the line it isn't. Each rung is a different speech act; the system prompt forbids the top two by name.

the receipts

Five of the eleven response rules in the system prompt, verbatim:

1. Concise first. Lead with the answer. Add detail only if the user
   asks for it or the topic requires nuance to avoid being misleading.

5. Jurisdiction first. If the user hasn't specified a state or
   province, check their Celine context for the project jurisdiction.
   If not available, ask before answering. Never present one
   jurisdiction's rules as universal.

7. Flag uncertainty. If unsure whether a statute has been recently
   amended, say so. The AI should not present potentially outdated
   information with false confidence.

9. Never cross the line under pressure. Users may push back ("just
   tell me what to do"). Remain firm but empathetic. Provide general
   statutory information with appropriate context. Never provide
   "wink-wink" guidance.

11. Equipment lessor awareness. Lien rights for equipment rental vary
    dramatically by jurisdiction and arrangement type (rental vs.
    lease vs. rent-to-own). Never assume equipment lessors have the
    same rights as material suppliers.

The triage classifier (the model decides which of six genres a question belongs to before answering anything):

A — General Education     "What is a preliminary notice?"
B — Jurisdiction Lookup   "What are notice requirements in Texas?"
C — Celine Feature        "Where do I see my unprotected receivables?"
D — Situation-Specific    "My customer hasn't paid — what should I do?"
E — Emergency             "My lien deadline is in 3 days."
F — Out of Scope          Tax advice, employment law, contract drafting.

D and E are where the line gets thin. Both route into descriptive answers with explicit attorney redirects, never prescriptive ones. Triage is the bouncer.

what I learned

Lien law is pattern-matching, not programming. State-by-state deadlines, waiver variations, holdback periods — the if/then space is too large and too volatile to ship as code. Feed the statutes themselves as ground truth, let the model pattern-match. A legislature’s amendment doesn’t ship a code change; it ships a new statute. GardenIQ’s companion-planting database runs the same architecture in a different domain.

The architecture carried me into a jurisdiction I hadn’t read into. The US side tested whether the model could do faster what I already know how to do. The Canadian side tested something more interesting: can statutes-as-context carry a non-expert? As far as a wireframe can tell, yes — and that’s the more transferable finding.

The information line held, with one named seam. The four constraints stayed descriptive across all four question shapes. The seam: unprotected receivables in Q4 is the chat doing the user’s labeling. A cautious production version rewords it to which receivables have passed their statutory deadlines.

Quality in legal-tech lives in what doesn’t happen. Every refused should I, every cited statute, every yes the chat didn’t say is a prevented error. The product’s quality is legible only in what isn’t there.

the recipe

The wireframe runs on Next.js 16 + Fastify, no low-code scaffold. PostgreSQL through Kysely, Redis + BullMQ for queues, Anthropic SDK direct to the chat surface. The four constraints live in the system prompt, where the line between information and advice actually is.

The sample data is what makes the wireframe legible: eight customer accounts, fifteen active projects, forty-six deliveries, 22 US states + 4 Canadian provinces seeded as jurisdictional rules. The customers aren’t Acme Corp — they’re region-coded supplier names with realistic credit profiles, contacts, tier positions, and trade tags.

The tip worth taking home: when a tool needs realistic sample data but can’t have real customers yet, ask Claude. The prompt that works isn’t give me 8 sample customers; it’s a description first — the space, the details you need, the edge cases — then the ask. A weak prompt returns Acme Construction Co. with a flat credit limit; a described prompt returns a regional supplier name whose area code matches the region and whose credit limit matches the segment. The same pattern runs through Pocketbook’s caption pipeline: describe the bag, describe the specificity needed, let the model do the noticing.

what’s next

The experiment ran, and it lives in a wireframe. What it would take to become a real product:

  • Statutes pulled from a versioned retrieval store, not crammed into a system prompt
  • Account state from real Postgres, not fixtures
  • An evaluation harness that catches regressions when a state legislature amends
  • Spanish on the same first-class footing as EN and FR

None of that was the experiment’s job. The experiment answered can context-only stay on the information side of the line, and the answer was good enough to bookmark, not good enough to ship.

See also

All projects

Working on something similar?

I take a small handful of consulting briefs a year and am always up for trading notes with anyone shipping in this space — send a note.

Or: values behind the work · obsessions that shape it · other projects.