Core Concepts
The object chain behind a research repository snapshot — Paper, Claim, Experiment, Run, Evidence, Attestation — and the rules behind the three verification rings and the License Gate.
CiteArk turns every paper into a "research repository". A repository's complete state at a point in time (its snapshot) is built from a single object chain: once the paper is structured, verifiable Claims are extracted; Claims link to experiment plans; experiments are actually executed and produce run records; runs leave evidence objects behind and are sealed with a signed attestation.
Paper
└── Claim a verifiable scientific finding extracted from the paper
└── Experiment the experiment plan that tests the claim
└── Run a record of one real execution
├── Evidence metrics, artifacts, logs, etc. produced by the run
└── Attestation a signed attestation of this executionThe research repository snapshot
GET /api/repositories?owner=<owner>&slug=<slug> returns { "repository": … }, the repository snapshot. Top-level fields:
| Field | Description |
|---|---|
id | Internal repository ID |
owner | Owner (user or organization name) |
slug | Repository name; with owner it forms the page URL /r/<owner>/<slug> |
title | Title |
description | Short description |
visibility | Visibility: public / private |
license | License identifier recorded for the repository |
licenseGate | License Gate assessment; see License Gate below |
topics | Topic tags |
head | Current head commit (with id, treeDigest, parentIds, message, author, authoredAt) |
readme | Paper overview Markdown generated by the compilation Agent |
sources[] | Source objects: paper, code repository, dataset, etc. (kind, uri, digest, capturedAt) |
files[] | File listing of the current snapshot (path, type, digest, size, role) |
claims[] | Extracted verifiable Claims; see Claims below |
experiments[] | Experiment plans; see Experiments below |
runs[] | Execution records; see Runs below |
evidence[] | Evidence objects; see Evidence & Content Addressing below |
compilation | Record of the paper's structured compilation (status, input digests, output commit, attestation) |
starCount | Star count |
requestCount | Community "request a reproduction" vote count |
forkCount | Fork count |
forkedFrom | Fork origin (source repository and commit) |
createdAt / updatedAt | Creation and last-updated times |
Claims
A Claim is a verifiable scientific finding extracted from a paper.
| Field | Description |
|---|---|
id | Claim ID (unique within the repository) |
versionId | sha256: digest of this version's content |
statement | The claim statement |
sourceLocator | Location in the original text |
type | finding / method / measurement / limitation |
verification | Verification status; enum listed below |
experimentIds | Linked experiment IDs |
evidenceIds | Linked evidence IDs |
successfulIndependentRuns | Number of successful independent reproductions |
failedIndependentRuns | Number of failed independent reproductions |
verification status enum: unverified, review_required, queued, running, verified, failed, inconclusive, cancelled, timed_out.
Experiments
An Experiment is a plan for testing a set of claims.
| Field | Description |
|---|---|
id | Experiment ID |
versionId | sha256: digest of this version's content |
title | Experiment title |
claimIds | Target claim IDs |
command | Execution command |
environmentDigest | sha256: digest of the execution environment |
expectedMetrics | Expected metrics array: name, comparator (>= / <= / ~= / =), target, tolerance (optional) |
reproductionLevel | Reproduction level: directional / official-checkpoint / full-training |
executor | Executor; the two values are described below |
Two kinds of executor:
builtin: the controlled private-beta executor (handlerara-structure-v1, recordingsourceRepository,sourceCommit, andrequiredPaths). The production reproduction queue currently only accepts experiments with this executor.agent: an Agent executor, withavailabilityofprivate-betaorunavailable.
Runs
Reproduction requests are asynchronous: a successful POST /api/runs returns 202 with a run record in state=queued, and execution proceeds in the background after the response. Clients poll runs[] in the repository snapshot until the run reaches a terminal state (verified / failed, etc.).
Key RunRecord fields:
| Field | Description |
|---|---|
id | Run ID |
repositoryId | Owning repository |
commitId | Repository commit executed (sha256: digest) |
experimentVersionId | Experiment version executed (sha256: digest) |
claimIds | Target claim IDs |
state | Run status, sharing the claim verification enum (queued / running / verified / failed, etc.) |
queuedAt / startedAt / finishedAt | Queue, start, and finish times |
agent | Executing Agent info (provider, model, prompt and tool-policy digests, etc.) |
environment | Execution environment (container image and digest, runner, cloud and region, CPU/memory/GPU) |
inputDigests / outputDigests | Lists of sha256: digests for inputs and outputs |
metrics | Measured metrics |
outputs | Typed scientific products (table, figure, dataset, model, checkpoint, text, archive, audio, video, or other) with role, digest, media type, storage mode, and related evidence IDs |
log | Execution log stream (system / stdout / stderr / tool) |
attestation | Execution attestation; see Attestation below |
Evidence & Content Addressing
Evidence is an evidence object produced by a run: kind is one of metric / artifact / log / checkpoint / figure, plus digest, uri, generatedByRunId, and summary. Evidence supports verification; runs[].outputs records what the execution scientifically produced. A single content-addressed file may serve both roles.
All binary objects are content-addressed: digest is the sha256 of the content. Downloads go through GET /api/objects/{64-char hex} (the digest without the sha256: prefix); the response header x-content-sha256 carries the full sha256:<hex>, so callers can recompute the sha256 of what they downloaded and compare it to verify integrity. The server also checks the stored object's digest and byte count before responding, returning 502 on mismatch.
Attestation
Every run carries an execution attestation (AttestationRecord): statementDigest, nodeId, keyId, algorithm (ed25519 / ecdsa-p256 / pending), signature, signedAt, and transparencyLog (the Transparency Log's index, entryDigest, previousEntryDigest). A freshly queued run's attestation is pending; it is signed only after execution completes.
Query an attestation by statementDigest: GET /api/attestations/{64-char hex} returns:
{
"attestation": { "statementDigest": "sha256:…", "signature": "…", "transparencyLog": { "index": 1, "entryDigest": "sha256:…" } },
"verified": true,
"verificationMethod": "ECDSA P-256 over CiteArk canonical JSON"
}verified is not a stored flag — it is the result of the server re-verifying the signature with the public key in the attestation at response time.
The three verification rings: Run · Match · Repeat
Run · Match · Repeat is CiteArk's shared trust language. The logic lives in deriveVerificationRings in src/domain/rings.ts:
- Run: some run in
runs[]hasstate=verified— the code actually ran. - Match: some verified run's
claimIdsintersect the set of claims withverification=verified— the run's results support the values the paper reports. - Repeat: some claim has
successfulIndependentRuns > 0— an independent Agent / runner / environment has reproduced it successfully.
The three rings are strictly progressive: successfulIndependentRuns only increments when an independent reproduction is verified, so when Repeat is lit, Match and Run are necessarily lit too (Repeat ⇒ Match ⇒ Run). All three rings can only be lit by real execution evidence — never by textual judgment alone.
Filled dots and outer circles have different meanings. ●●● means Repeat. The dots become ◉◉◉ only at L5, after a paper author or trusted institution has signed the exact Artifact root. A runner attestation, community reproduction, or Agent-written conclusion must never create the outer circles.
Badge levels share the same source as the rings (src/domain/badge.ts): L2 reproduced = Match, L1 executed = Run, L0 indexed = compilation.state === verified.
License Gate
The snapshot's licenseGate field records the license assessment:
| Field | Description |
|---|---|
status | green / yellow / red |
paperLicense | Paper license |
codeLicense | Code license (may be absent) |
sourceUrl | Original source URL |
discoverable | Whether CiteArk may discover and pin public research sources |
executable | Whether CiteArk may execute the research in an isolated sandbox |
redistributable | Whether CiteArk may redistribute third-party source materials |
artifactPublishable | Whether CiteArk may publish derived execution records |
submitterAttested | Whether the submitter attested they have the right to submit and process these materials |
reason | Reason for the assessment |
assessedAt | Time of assessment |
Assessment rules (assessLicense in src/domain/license.ts, matched in order):
- Submitter has not attested ownership (
submitterAttested=false) → red; - The paper license is in the open set (
CC0-1.0,CC-BY-4.0,CC-BY-SA-4.0,MIT,Apache-2.0) and the code license permits execution (absent,no-code, or one ofMIT,Apache-2.0,BSD-2-Clause,BSD-3-Clause,ISC,MPL-2.0,GPL-3.0-only) → green; - Paper license is
publisher-restricted→ red; - Everything else → yellow.
Derived fields:
discoverableandexecutablefollow the submitter attestation and do not depend on redistribution rights;redistributableistruewhen the submitter attested and the paper license itself is open; it does not depend on the separate code-license assessment;artifactPublishablecovers CiteArk-generated metrics, logs, traces, typed scientific outputs, attestations, and verification records. CAP files never include third-party paper, repository, dataset, or checkpoint source payloads; a dataset or checkpoint genuinely produced by the recorded run may be published as a derived output when its license permits it.
License status is therefore a source-handling and risk label, not an ingestion or execution gate. Yellow and red repositories can still be discovered and executed; their source materials remain link-only unless redistribution is explicitly permitted.
Downloading a paper PDF whose license forbids redistribution via /api/objects returns 451 ("the paper's license does not allow CiteArk to redistribute it; visit the original source"), and the page only links back to the original source.
Public projection
The repository snapshot is an internal read model. When a non-owner reads a public repository, the snapshot passes through the public projection (src/server/public-projection.ts) before serialization:
- Internal storage URIs (
r2://, etc.) insources[],evidence[], andruns[].outputs[]are rewritten to/api/objects/<hex>; external URLs have credentials and sensitive query parameters stripped; requestedByis erased fromruns[];run.logkeeps only thesystem/stdoutstreams, each message truncated to 4000 characters, withBearertokens and assignments likeapi_key/token/secret/password/authorizationredacted.