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.
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.
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 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, reasoning over the lint outputAgent: 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.
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.
A run as it lands: the jurisdictions 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: the decision it carries, where the work lives, and the first of the laws behind it, with its citation and what it requires.