Use a remote when the local record depends on identities owned elsewhere.
A remote reference is a prefix, a delimiter and a uid: the prefix names the remote, the uid is whatever that remote’s identifiers look like (ADR-024). Luria reads remotes as public URLs over HTTPS, with deliberately no credential path, so what CI resolves is what any reader can follow (ADR-016).
Another Luria record
Declare a remote prefix for the foreign record:
remotes:
LU:
name: luria
repo: dmarx/luria
ref: mainLocal citations can then compose the remote prefix with the foreign scheme/code — LU-ADR-013 — rather than pretending the object is local. luria link --fix links each one to the URL the remote constructs.
Arbitrary identifier namespace
For identifiers such as arXiv IDs or issue keys, give the remote a uid pattern and a url template over its capture groups:
remotes:
ARXIV:
uid: '(\d{4})[.:](\d{4,5})'
url: https://arxiv.org/abs/{1}.{2}A citation written as a code, ARXIV-2301.00001, is then a checked reference: luria link --fix links it to the constructed URL. Hand-written URLs are not rewritten. A link whose text is a remote code but whose target is not the constructed URL is reported under hand-written-urls, and url-ok: acknowledges a deliberate one. See the configuration reference for the rest of a remote’s keys.
Refresh/check remote knowledge
$ luria remoteslists every foreign code the record cites, per remote, with the URL it resolves to and the evidence behind it. The flags:
luria remotes --refreshdiscovers each GitHub remote’s actual filenames intoremotes.lock.jsonand re-observes pinned content,luria remotes --checkHEAD-probes every cited URL and reports what a reader would find — it needs the network, and it is a report, never a failure,luria remotes --pin [CODE]endorses remote content by hash (below),luria remotes --resolve [CODE]records what each identifier’s title actually is, for remotes that declare how to ask, so the lint can report a document whosearxiv:field names a different paper (source-mismatch).
remotes.lock.json is committed, so CI and offline checkouts resolve identically. The lint only reads it; in CI the --resolve write runs where merges serialize, not on every branch (ADR-112, and see CI). luria remotes has the full behavior.
Choose a network policy
lint.network in luria.yaml says how far luria lint may go:
lint:
network: neverauto(the default) — opportunistic: ask about identifiers the lockfile has no answer for, and report them as unchecked (source-unchecked) when the network is not there,never— no network; answer only from the lockfile,require— required network verification: an identifier nothing could verify fails the lint without namingsource-uncheckedinfail_on.
Document the policy in CI so a green build has a clear meaning.
Pin content when identity alone is not enough
When your claim depends on the actual content of a foreign source rather than merely its continued existence, pin it (ADR-066). For a remote code:
$ luria remotes --pin LU-ADR-001
LU-ADR-001: pinned at sha256:08973b257786…
wrote remotes.lock.jsonFor an arbitrary URL, register it with a pin: directive where it is cited, then run a bare luria remotes --pin:
<!-- pin: https://spec.example/v1.html — the spec this implements -->
We follow [the spec](https://spec.example/v1.html).A later upstream content change then becomes a local finding: once luria remotes --refresh re-observes the content, luria lint reports it under remote-drift. Review the change and run luria remotes --pin CODE again to re-endorse it; a bare --pin never re-endorses drifted content. Comment directives covers pin:.
That extends truth maintenance beyond repository boundaries.