CAPTURE WAVE1 CONTRACT
Repository: thelaplage/counterpedia-acquisition
Presentation-only rendering. Counterpedia preserves this document’s source Markdown bytes exactly and formats them for reading here. This does not admit the document, verify its claims, or convert it into a governed Counterpedia entry.
Repository: thelaplage/counterpedia-acquisition
Bound main SHA: eac638def41922fdaacfa04d1b0302de9d2ed5e7
Target branch: feat/demo-corpus-capture-wave1-v0-1
P0 manifest entries: 112
Subjects: 12
State: acquisition / pre-adjudication only
Purpose
Convert the research dossiers' P0 web-reconnaissance sources into durable acquisition evidence:
requested locator → HTTP attempt → exact captured bytes → sha256 content address → CaptureReceipt → attempt/run log → deterministic passage anchors → research edition-lineage observation
This wave does not decide what any source proves.
Constitutional boundary
The existing counterpedia-acquisition boundary remains binding:
agents may discover, capture, observe, and propose;
source identity remains acquisition-local and URL-derived under the existing code;
exact bytes remain content addressed;
each capture attempt retains its own receipt/outcome;
redirects do not rewrite source identity;
failures do not create fake receipts;
there is no admission, approval, publication, or standing authority here.
This wave MUST NOT:
redesign
SourceRecord,SourceEdition, Artifact identity, or Counterpedia namespace rules;mint canonical
cp:*IDs;write ClaimGraph/admission state;
assign epistemic confidence;
generate article prose;
treat source class/priority as truth weight;
silently replace origin bytes with a mirror;
infer equality of two artifacts from title/URL similarity.
P0 manifest semantics
The manifest is research/run input, not canonical source identity.
dossier_source_id such as TIT-S02 is an inventory key only.
capture_mode values:
FETCH_DIRECT— attempt the requested locator directly.DISCOVERY_PAGE/DISCOVERY_INDEX— capture the page itself; child artifacts remain separate.MULTI_ARTIFACT_SOURCE— one research source ID requires multiple exact child artifacts; runner records the landing capture and a child-resolution queue, but MUST NOT recursively crawl without explicit bounded resolver rules.DISCOVERY_REQUIRED— the dossier identifies an exact source object but current direct origin locator is unresolved. Do not invent one.ORIGIN_REQUIRED— a mirror/recon copy exists, but governed capture must locate or explicitly distinguish the origin.EXPAND_LINKED_PACKAGE— capture landing page, then operator-approved exact linked documents individually.SAME_ARTIFACT_SECTION— no second fetch; passage anchor is against another already captured artifact.BLOCKED_PRIMARY_BYTES— STOP for that source until acceptable institutional/court/origin bytes are found.
Run output contract
A run directory must be self-contained and immutable after closure:
run.json
program.json
manifest.snapshot.json
attempts.jsonl
receipts.jsonl
lineage_hints.jsonl
anchors.jsonl
failures.jsonl
objects/run.json
Must include:
run UUID
start/end UTC
git repo + exact commit
manifest sha256
Python version
acquisition package version/commit
extractor names + versions
configured max bytes / timeout
final counts by disposition
exact bytes
Use the existing FilesystemObjectStore.
Never write partial response bodies.
Never trust Content-Length as byte count.
passage anchors
Anchors are derived extraction artifacts, not claims.
Every anchor must bind to:
exact artifact sha256;
capture ID;
source inventory key;
extractor ID/version;
locator type (
html_text_span,pdf_page_text,pdf_page_figure, etc.);page/index/span;
extracted passage text hash;
extraction timestamp UTC.
PDF extraction:
deterministic text extraction only;
no OCR in v0.1;
if page text is empty/image-only, emit
ANCHOR_UNAVAILABLE_IMAGE_ONLY, then permit figure/page anchors without inventing OCR text.
HTML extraction:
anchor against exact HTTP bytes, not browser-rendered text.
normalized visible-text extraction may be emitted only with extractor/version metadata.
edition lineage
The acquisition lane may record research lineage hints only:
correctsamendsupdated_version_ofsame_artifact_sectioncandidate_same_document
A lineage hint becomes useful only after the exact artifact digests on both sides are known.
It MUST NOT mint or assert canonical SourceEdition identity.
STOP conditions
For an individual entry:
no acceptable origin locator where origin is required;
HTTP non-200 under current fetch contract;
byte limit exceeded;
timeout;
malformed transport metadata;
redirect to a non-http(s) target;
content cannot be extracted without OCR where OCR is not allowed;
mirror found but origin equivalence not byte-proven.
Record the disposition and continue other entries.
For the entire run:
manifest validation failure;
duplicate
capture_key;non-http(s) fetch locator;
repo main mismatch during implementation preflight;
any code path that creates admission/standing/publication state;
any attempt to fabricate a receipt for a failed capture.
Acceptance target
The wave is successful even if some sources remain blocked.
Success means:
every one of the 112 P0 manifest entries has a deterministic final disposition;
every successful fetch has exact bytes + verified sha256 + real CaptureReceipt;
every failed/blocked item remains visible;
no mirror is silently promoted;
passage anchors exist where deterministic extraction permits them;
image-only pages are page/figure anchored or explicitly marked unavailable;
edition/correction relationships remain typed research hints;
no adjudication occurred.