Docs menu

Guides

One full run, end to end

A developer has vibe-coded a research assistant: it crawls public pages for context and drafts articles with an LLM. Before shipping to users in the US, Germany, and South Korea, they ask their coding agent to lint it: to surface exposure before shipping, not to certify the app.

1 · The agent works out whose law applies

The app crawls two sources the developer named. Server location is noise; what matters is each operator's jurisdiction, so the agent resolves the domains first.

the agent's tool callssample output
resolve_domain_jurisdiction(domain="stadt-koeln.de") → { jurisdiction: "de", method: "entity_domains" } resolve_domain_jurisdiction(domain="cool-startup.ai") → { jurisdiction: null, method: "unknown" } # .ai is a vanity TLD: LexLint refuses to guess. # The agent checks the operator's terms page and finds a # Delaware company: lint "us".

2 · Declare the profile, run the lint

The agent declares what the app actually does. It crawls, and it generates content; it does not train models on the crawled text, so it declares only what is true.

the declaration and the lintsample output
set_profile( activities=["crawls_web", "generates_content"], jurisdictions=["us", "de", "eu", "kr"] ) ← profile accepted · 4 of 4 jurisdictions held us 19 · de 8 · eu 12 · kr 3 instruments # run_lint is a fixed, rule-based match of the declaration # against the law library. No model reasons about the law here: # the same lists, law library build and instant always give the # same findings. run_lint( activities=["crawls_web", "generates_content"], jurisdictions=["us", "de", "eu", "kr"] )
WARNeuTDM opt-outs are enforceable rights reservations under Article 4(3), which requires honoring machine-readable reservations when crawlingDSM Directive Art. 4(3) · as of 2026-07-27
WARNeuSynthetic content transparency: Article 50 requires AI-generated text to be identifiable as such in some contextsAI Act Art. 50 · as of 2026-07-27
INFOkrGenerated-content labeling duties phase inAI Framework Act · as of 2026-06-30
0 errors, 2 warnings, 1 info: review the warnings below

3 · The agent reads the findings back into its plan

Steps 1 and 3 are the agent's judgment, and so is the declaration at the top of step 2. The match under it is not: which law comes back for that declaration is a fixed, rule-based match against the LexLint law library, never a model reasoning about the law, so the agent's reading starts from findings that would be the same whoever declared those two lists.

This is where a lint earns its keep with an LLM at the keyboard: the findings are structured, cited, and specific enough for the agent to map each one onto the code it just wrote.

the agent's plansample output
# the agent, reasoning over the lint output Agent: Two findings implicate code in this repo. The TDM warning lands on fetcher.py: I crawl stadt-koeln.de but never check for machine-readable opt-out signals before fetching. The two labeling entries land on render.py: drafts ship with no indication they are AI-assisted, and the KR duties phase in on dates I should record next to the label logic. The two coverage notes implicate nothing here: this app neither gates by age nor aggregates news, so I record that I read them and move on. Were either true, run_lint would not have told me, and I would call get_law for those topics by hand. Agent: Fixing both files now, while the change is cheap.

4 · ...and fixes the app

the agent's editssample output
# fetcher.py: honor machine-readable TDM reservations # (DSM Art. 4(3)) - html = fetch(url).html + resp = fetch(url) + if tdm_opt_out(resp.headers, resp.html): + return skip(url, reason="TDM rights reserved") + html = resp.html # render.py: label synthetic content # (AI Act Art. 50; KR phase-in) + draft.badge = "AI-assisted draft" + # KR labeling duties phase in: AI Framework Act + draft.meta["generator"] = APP_NAME

The crawler now checks reservation signals before every fetch, and drafts carry a visible label with the phase-in duty recorded where the next developer will see it.

5 · What the run means, and what it does not

The findings do not disappear on re-run: obligations apply whether or not you have met them, and LexLint reports what applies. What changed is that every finding now maps to a shipped mitigation, each with a citation for counsel to start from. The app is not "compliant": LexLint cannot know that, and says so. What the team has is the basics caught early, at the moment they were cheapest to fix.

6 · The people around the agent read the same findings in the portal

The agent works from the findings in its terminal. The team reads them in the portal, where each run is kept against its project, the findings are grouped into pieces of work, and a decision on each one is recorded beside the laws it answers to. These two pictures come from the portal's demo, an anonymized app that is not the research assistant above.

The LexLint portal's page for one run of a demo project called Sideline: the places it checked, a line saying how many obligations apply now and how many laws are not in force today, by state, tabs for the developer, product owner and counsel views, and the developer's first two work items, both marked acknowledged.
A run as it lands: the places it checked, what applies now and what is not in force today, by state, and the developer's first work items, each already triaged.
One work item opened in the portal, about labelling AI-written text and audio as AI-generated: its decision, the note from the triage saying what already ships and what is outstanding, and the first law behind it, with its citation, the day it came into force, the date it was last checked and what it requires.
One work item opened: the decision it carries, where the work lives, and the first of the laws behind it, with its citation and what it requires.

Connect your agent →