honest-scholar meta-spec; realized in this repo (skills + CLI).
Sub-spec of 00-meta-spec.md. Defines the foundation that sub-specs 2 (literature) and 3 (dataset) build on: the asset-provenance substrate (registry pattern + private mirror + fixity + persistent-ID) and the experiment-backend contract. Governed by the meta-spec’s ⚑ guiding principle (assistants, not researchers) and its light-dependency posture. Grounding: dataset-management-standards, dataset-tooling-mirror.
1. Purpose
Two things are shared across the plugin and therefore specified once, here:- The asset-provenance substrate — the common machinery under
literatureanddataset: how the plugin keeps a git-tracked registry of externally sourced, persistently identified, license-bearing, mirror-able assets, and how it fetches and verifies durable copies.literatureanddatasetare distinct front-ends over this one substrate (they share the mechanism, not the file). - The experiment-backend contract — the stable interface through which the pipeline skills obtain and cite experimental evidence, so the runner is hot-swappable and no pipeline skill depends on a concrete tool.
2. The asset-provenance substrate
2.1 What is shared vs. extended
The substrate provides a base asset record and the mechanism to materialize and verify it. Each front-end extends the base with its own schema and adds its own acquisition/analysis logic (specified in sub-specs 2 and 3). Base asset record (the spine):
Basis: FAIR (Wilkinson 2016), FORCE11 data-citation, DataCite v4.6, fixity/BagIt — see the standards digest.
literatureextends it with bibliographic fields (authors/venue/year), a triage sidecar (role, disposition, rationale,seededlinks, citation intent), and the PDF as thefiles[]payload. Its registry format is a standard bibliography (BibTeX / CSL-JSON) + a YAML triage sidecar, not a clone of the dataset manifest (sub-spec 2).datasetextends it withtier(A/B/C), aretrievalrecipe,datasheet,sensitivity, and data blobs as thefiles[]payload; its registry isdatasets.yml(sub-spec 3).
2.2 Persistent-ID & citation layer
A single shared module resolves and records persistent identifiers (DOI, arXiv, DataCite) and emits citations. Papers and datasets are both DOI-citable; the same code mints/recordspid and renders citation. This is the interop seam to
external archives (Zenodo/figshare/Dryad) and to Croissant/BibTeX export.
2.3 Private mirror + fixity (the mechanism)
The durable-copy mechanism is identical for a PDF and a.parquet and is
specified once:
- Engine:
rclone— invoked as a subprocess (a single Go binary, not a Python dependency). Backend-agnostic (Google Drive first; S3/B2/R2/SFTP/WebDAV/… by config). The registry names a logical remote + base path; the credential-bearingrclone.confis never committed (untracked file viaRCLONE_CONFIG, or env-var remotes from CI secrets). Arclone.conf.example(remote name + type only) is committed.rclone obscureis not encryption and is never committed. - Fixity: two-layer. The authoritative checksum is SHA-256, stored in the registry (integrity == identity == citation-verifiability). rclone’s native per-backend hash (often MD5 on Google Drive/S3) is used only as a transfer check; after any transfer the local bytes are re-hashed against the registry SHA-256 — so verification is backend-independent and the manifest is the single source of truth. (Resolves the meta-spec §10 hash open item: SHA-256 authoritative; MD5/native only as a transport check.)
- Store layout: gitignored cache; content-addressed on the wire
(
sha256/<hash>mirror keys → dedup, integrity == identity), name-addressed for use (symlink/copy from the content-addressed blob).
2.4 Resolution chain
materialize(asset) — verify fixity at every hop; a file failing verification is
treated as absent and the chain continues:
2.5 License / redistribution rule (shared, non-negotiable)
Redistribution rights are set by the license, recorded on the base record, and are never implied by the existence of a mirror. A private mirror is storage, not a redistribution grant. The substrate refuses to treat mirror presence as permission to commit bytes in-repo, and never surfaces mirror contents publicly. (Applies identically to copyrighted PDFs and licensed data.)2.6 Plugin vs. consumer
- Plugin: base-record schema + loader/validator; the persistent-ID/citation
module; the rclone mirror integration + fixity + content-addressed cache; the
resolution chain (steps 1/2/4); the
rclone.conf.examplegenerator and secret-hygiene docs. Deps:rclone(subprocess) +pyyaml(+pooch, owned by the dataset front-end). - Consumer: the registry entries + SHA-256 checksums; the real rclone remote config (untracked/CI); mirror blobs; the gitignored cache.
3. The experiment-backend contract
Pipeline skills never run experiments directly; they depend on this contract, and each consumer binds a concrete implementation. The contract has four capabilities:
Semantics:
- A run-ref is the citable unit of evidence.
findings.md(hypothesis) and the paperledger/decisionreference run-refs, never raw numbers copied by hand. Thetablescapability is the only writer of result numbers into docs (managed, regenerable blocks). - The provenance stamp must carry the dataset fingerprint from §2
(
id+version+sha256), so every reported result resolves to exact bytes. is-currentis what makes selective re-execution honest: a hypothesis or paper can ask “is my evidence stale?” without knowing how the backend computes staleness.- The contract is agnostic to how experiments run (local, GPU fan-out, cluster, cached). Nothing above mentions a scheduler.
3.1 Binding
Each project binds a backend indocs/research/papers.md via a required
backend: field — there is no bundled default; the plugin ships only the
contract. A backend is any implementation exposing the four capabilities. Pipeline
skills resolve the backend from the binding; they contain no backend-specific
logic.
3.2 Implementations
- The plugin bundles no backend — it ships the contract only, so it stays
domain-neutral. Each project supplies an implementation of the four capabilities
and binds it in
papers.md. - A typical implementation maps the capabilities onto the project’s own tooling:
run= its experiment executor (local, GPU-pool, or cluster);evidence= committed results + a provenance sidecar (datasetid+version+sha256, config hash, code provenance);tables= a managed-block write-back into docs;is-current= a provenance/closure hash. A lightweight local runner and a large-scale GPU orchestrator are equally valid. - Because the contract is abstract, different projects may bind different backends without touching any pipeline skill.
3.3 Agency-principle interaction
The backend produces and stamps evidence; it never adjudicates it. Whether the evidence confirms or refutes a hypothesis, or supports publication, is a human decision recorded with a sign-off (meta-spec §2.1).is-current reports
staleness; it does not decide to re-run — the researcher does.
4. Open items
- run-ref format — opaque string vs structured (backend-hash + trial-id); settle when cross-backend interop is first contemplated. Default: opaque string the backend can resolve.
- Croissant/BibTeX export placement — whether the persistent-ID module owns
export, or each front-end does; lean toward the shared module for
pid/citation and the front-end for its native format (BibTeX for literature, Croissant for dataset). - Cache directory name — align with the meta-spec’s
.honest-scholar/decision.
5. Downstream
Sub-spec 2 (literature) and sub-spec 3 (dataset) consume §2. Sub-spec 1 (lifecycle) consumes §3 (pipeline skills cite run-refs;hypothesis-testing,
paper-synthesis, and the progress roll-up read evidence/is-current).