Skip to content

docs(adr): ADR-0008 — COT vintage provenance stays in cotdata, persisted in Parquet - #13

Merged
mspinola merged 7 commits into
mainfrom
claude/adr-0008-cot-vintage-provenance
Jul 31, 2026
Merged

docs(adr): ADR-0008 — COT vintage provenance stays in cotdata, persisted in Parquet#13
mspinola merged 7 commits into
mainfrom
claude/adr-0008-cot-vintage-provenance

Conversation

@mspinola

Copy link
Copy Markdown
Owner

Records a decision that sits directly on ADR-0007's boundary, and answers a question 0007 leaves open: with cotdata being narrowed to COT only, is as-published provenance for that COT data inside the boundary or outside it?

Decision: inside, and persisted in the existing Parquet + manifest contract with no database.

  • The ADR-0007 narrowing runs along the instrument-domain axis (COT vs bars), not the derived vs raw axis, so vintage capture never crosses that seam.
  • Capture also has to sit beside the fetch, since it records what the source served at a moment in time. Splitting it from the producer would put the capture layer where it cannot observe what it exists to record.
  • The original external spec called for DuckDB/SQLite. Rejected: change-only writes keep the whole history in single-digit MB, and DuckDB can query the Parquet directly without becoming the storage format.

Why here rather than in cotdata

The scope half of this decision interprets ADR-0007. A cotdata-local ADR pointing at 0007 would be a one-way link: someone reading 0007 later to decide what cotdata may contain would never discover the boundary had already been reasoned about.

So the load-bearing change in this PR is the back-link added to ADR-0007's Decision section — without it, relocating the file accomplishes nothing. cotdata keeps a stub pointing here.

Status

Accepted as to the decision, implementation complete but unmerged — it lives on cotdata branch claude/cot-revision-snapshots-9b196f (cotdata PR #78). This is the ADR-0007 distinction in the opposite direction: 0007 was accepted as a direction with the work outstanding; here the work is done and only the merge is.

If cotdata #78 merges first, the status line needs a one-word edit.

Open questions recorded

Carried into the ADR so they live in the architecture log rather than only in a PR description: futures-only capture (combined is constant-False, half the reportable universe absent), Legacy-only ingest wiring, whether a detected revision should invalidate cotmetrics caches (it keys on schema_version, which a revision does not bump), and retention policy.

Verification

Docs-only, but the full suite was run rather than assumed inert — 357 passed — since this repo has a prose-sensitive test_no_findings_in_prose.py.

🤖 Generated with Claude Code

mspinola and others added 7 commits July 30, 2026 19:30
…quet

Answers a question ADR-0007 leaves open: with cotdata being narrowed to COT only, is
as-published provenance for that COT data inside the boundary or outside it.

Decision: inside, and persisted in the existing Parquet + manifest contract with no
database. The ADR-0007 narrowing runs along the instrument-domain axis (COT versus
bars), not the derived-versus-raw axis, so vintage capture never crosses that seam. It
also has to sit beside the fetch, since capture records what the source served at a
moment in time. The original external spec called for DuckDB/SQLite; rejected, because
change-only writes keep the whole history in single-digit MB and DuckDB can query the
Parquet directly anyway without becoming the storage format.

Recorded here rather than in cotdata because the scope half interprets ADR-0007, and a
cotdata-local ADR pointing at 0007 would be a one-way link: someone reading 0007 later
to decide what cotdata may contain would never discover the boundary had been reasoned
about. ADR-0007 therefore gains a back-link at its Decision section, which is the edit
that makes the relocation worth anything. cotdata keeps a stub pointing here.

Status is Accepted as to the decision, implementation complete but unmerged
(cotdata PR #78) — the mirror of 0007, which was accepted as a direction with the work
outstanding.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…y monitor)

Committed verbatim as authored, before any amendment. v0.1 system description for the
equity-side monitor; its §12 names the futures/COT adapter as the current priority,
which is what the cotdata vintage work implements.

Filed under docs/adr/ as placed; relocated to docs/design/ in the following commit,
since docs/adr/ otherwise holds only ADR-NNNN records.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Moved docs/adr/crowdmon_system_description.md -> docs/design/. It is a v0.1 system
  description, not an architecture decision record, and docs/adr/ otherwise holds only
  ADR-NNNN files. Left in place for one commit so the as-authored state is in history.
- §12 records that step 1 of the futures/COT adapter is built (cotdata PR #78, decision
  in ADR-0008), plus the two outcomes that bear on this document's own plan: the shared
  store is Parquet rather than DuckDB, and vintage history is forward-only, so any
  validation resting on as-of correctness over pre-capture history is permanently
  unavailable rather than pending.

The ADR-0008 link dangles on main until crucible-stack PR #13 merges; called out inline.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ADR-0008 travels in the same PR as this document, so that link resolves on the branch
and after merge; the dangling-link warning was written while they were on separate
branches and no longer describes reality.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Moving that doc out of docs/adr/ brought it under the prose guard for the first time
(EXCLUDED_DIRS exempts docs/adr/), and it failed on $100m — the statutory 13F filing
threshold. That is a public SEC reporting rule bounding what ownership data can observe,
not an account size or a result, so it is a false positive and takes a documented
ALLOWED entry rather than a reworded fact.

Trade-off worth knowing: ALLOWED exempts the whole file, so if this document later
accumulates genuine findings the guard will not catch them. Rewording to drop the
numeral is the alternative if that matters more than stating the threshold.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…e ALLOWED entry

Reverses the previous commit's approach. An ALLOWED entry exempts the WHOLE file from
the prose guard, which is far broader than the one false positive warranted: this is a
433-line public-repo document likely to grow, and exempting it wholesale means a genuine
finding added later would pass unnoticed.

Rewording costs nothing here. The two sites said 'managers >$100m' and 'Managers under
$100m'; they now name the 13F reporting threshold directly, which is what the number
was standing in for. Arguably more durable too, since the doc no longer goes stale if
the SEC ever revises the figure.

The guard is now live on the file: it moves from exempted to scanned, and the suite
gains a case (357 -> 358).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The status said 'implementation complete but unmerged, pending review'. #78 has now
merged, so that line was about to become exactly the kind of stale status section this
repo has had to correct before (see #12).

Also states what did and did not ship, and that no production vintage has been captured
yet -- the subsystem is merged but its scheduled task is not running, so the series
still begins at first capture.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@mspinola
mspinola merged commit aab4dea into main Jul 31, 2026
1 check passed
@mspinola
mspinola deleted the claude/adr-0008-cot-vintage-provenance branch July 31, 2026 00:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant