Extend dataset ingester with immutable provenance and deletion receipts #25

Closed
opened 2026-08-19 01:59:00 +00:00 by timmy · 1 comment
Owner

Parent epic: #3

Outcome

Promote the tested ingest script into an auditable corpus pipeline.

Acceptance criteria

  • Manifest records consent, source, subject key, hashes, derivation, review, split, and lifecycle state.
  • Revocation creates a tombstone and removes raw/derived bytes from active datasets.
  • Illegal lifecycle transitions fail tests.

Dependencies

  • #24 — Implement separate opt-in training contribution and withdrawal flow

Required evidence

  • Test or executable receipt attached to the issue/PR
  • Privacy/safety boundary checked where applicable
  • Clean checkout and relevant full suite pass

Delivery

Open a focused branch and PR with Closes #ISSUE. Do not include real medical images in issue comments or Git history.

Parent epic: #3 ## Outcome Promote the tested ingest script into an auditable corpus pipeline. ## Acceptance criteria - [ ] Manifest records consent, source, subject key, hashes, derivation, review, split, and lifecycle state. - [ ] Revocation creates a tombstone and removes raw/derived bytes from active datasets. - [ ] Illegal lifecycle transitions fail tests. ## Dependencies - #24 — Implement separate opt-in training contribution and withdrawal flow ## Required evidence - Test or executable receipt attached to the issue/PR - Privacy/safety boundary checked where applicable - Clean checkout and relevant full suite pass ## Delivery Open a focused branch and PR with `Closes #ISSUE`. Do not include real medical images in issue comments or Git history.
timmy added this to the M2 — Consented Dataset & Specialist Model milestone 2026-08-19 01:59:00 +00:00
timmy added the type/featurepriority/P0area/dataarea/privacy labels 2026-08-19 01:59:00 +00:00
Member

[EVIDENCE] agent=timmy

PR: #85 (branch timmy/25-corpus-provenance-tombstones at 860c84f, base main). Open, not merged.

All three acceptance criteria landed test-first in tests/corpus-manifest.test.py (8 tests, watched RED before each implementation):

  • Manifest records consent (version + timestamp), source kind and raw-input digest, raw and derived hashes, the derivation pipeline, review status, salted-subject split, and lifecycle state; the caller's path is never recorded.
  • --revoke <contribution-id> --reason deletes the derived image and any raw pre-derivation copy, then appends a tombstone naming every artifact by contribution id + digest while dropping labels, subject key, and paths. The manifest stays append-only and active_records() excludes tombstoned samples.
  • Refused: revoked -> active, unknown state, reason-less revocation, unknown contribution, double revocation, duplicate contribution id, and a second label set for one derived image. The duplicate guard runs before any byte is written, so a refused ingest leaves no orphan image.

Two honest notes: transition() guards passed on first write (hold-out check, not a RED cycle), and npm test shows one flaky staging-health.test.js startup test (800 ms spawn budget) that reproduces on a clean origin/main checkout without these changes.

No browser surface changed, so record_release_demo.mjs is untouched and claims nothing new; the nearest honest visible effect is the #24 withdrawn-receipt tombstone already on camera. Gates: corpus suite 8/8, staging-deploy 20/20, check:syntax and check:diff clean, no dataset bytes, weights, or secrets added.

[EVIDENCE] agent=timmy PR: https://forge.alexanderwhitestone.com/git/stackchain/timmy-talking-turd/pulls/85 (branch `timmy/25-corpus-provenance-tombstones` at 860c84f, base main). Open, not merged. All three acceptance criteria landed test-first in `tests/corpus-manifest.test.py` (8 tests, watched RED before each implementation): - Manifest records consent (version + timestamp), source kind and raw-input digest, raw and derived hashes, the derivation pipeline, review status, salted-subject split, and lifecycle state; the caller's path is never recorded. - `--revoke <contribution-id> --reason` deletes the derived image and any raw pre-derivation copy, then appends a tombstone naming every artifact by contribution id + digest while dropping labels, subject key, and paths. The manifest stays append-only and `active_records()` excludes tombstoned samples. - Refused: revoked -> active, unknown state, reason-less revocation, unknown contribution, double revocation, duplicate contribution id, and a second label set for one derived image. The duplicate guard runs before any byte is written, so a refused ingest leaves no orphan image. Two honest notes: `transition()` guards passed on first write (hold-out check, not a RED cycle), and `npm test` shows one flaky `staging-health.test.js` startup test (800 ms spawn budget) that reproduces on a clean origin/main checkout without these changes. No browser surface changed, so `record_release_demo.mjs` is untouched and claims nothing new; the nearest honest visible effect is the #24 withdrawn-receipt tombstone already on camera. Gates: corpus suite 8/8, staging-deploy 20/20, check:syntax and check:diff clean, no dataset bytes, weights, or secrets added.
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: stackchain/timmy-talking-turd#25