READ impossible without a successful machine receipt (SOURCE_READ with matching URL); artifact-claimed-read without receipt downgrades to FAILED honestly
BLOCKED / FAILED / NOT_SELECTED appear in the ledger and back ZERO accepted claims; NOT_SELECTED (never attempted) distinct from BLOCKED (attempted, refused)
runner/model from persisted factual fields only, UNKNOWN if absent — never reconstructed from session memory; model+runner now persisted into the accepted artifact at the smallest authority point
requested_url + resolved_url both retained
explicit contradicts_source_ids used when present; legacy nesting labeled in render; plain-string contradictions honestly not linked
renderer failure raises visibly; publication failure raises visibly; neither alters research cognition or stage outcomes
receipt_id deterministic: hash of stage+tool+canonical_url+timestamp+event-seq
no trust scores — factual classification only
Real acceptance on #161 (legacy artifact, honest labels):
16 records: 4 READ (machine receipts replayed from the genuine events file), 12 NOT_SELECTED backing zero claims
scripts/source_ledger.py — pure deterministic projection:
- build_records: accepted OUTWARD artifact + SOURCE_READ/TOOL_FAILED receipts
→ ledger records with receipt_id (deterministic hash of stage+tool+
canonical_url+timestamp+seq), source_id, requested_url+resolved_url,
domain, status, tool, timestamp, source_type, claim_ids,
contradiction_ids, blocked_reason
- THE safety invariant: READ impossible without a successful machine
receipt; artifact-claimed-read with no matching receipt downgrades to
FAILED honestly; BLOCKED/FAILED/NOT_SELECTED back ZERO accepted claims
- NOT_SELECTED distinct from BLOCKED (never attempted ≠ attempted-refused)
- explicit contradicts_source_ids used when present; legacy nesting labeled
in render; plain-string contradictions not linked (labeled honestly)
- render_markdown: fixed template; runner/model from persisted factual
fields only, UNKNOWN if absent — never reconstructed
scripts/publish_source_ledger.py — idempotent Gitea publication:
- comment identified by marker containing artifact hash; same hash UPDATES,
new hash creates; publication failure raises VISIBLY (never silently
falsifies the ledger) and does not alter stage outcomes
research_stage_executor.py: model + runner persisted into the accepted
OUTWARD artifact (smallest authority point; PROV-1 metadata fields)
Real acceptance on #161: 16 records (4 READ with machine receipts replayed
from the genuine events file, 12 NOT_SELECTED backing zero claims), ledger
live on Gitea issue 161 (comment 3510), idempotency proven (second publish
updates same comment). Legacy artifact honestly labeled UNKNOWN for
runner/model and legacy-nesting noted in render.
14 ledger tests; full suite 1151 passed; ruff clean.
🤖Headless spec gate (non-blocking, #204 first slice)
Spec-gate agent produced no text output — check runner logs.
Deterministic floors still govern the merge
This comment is advisory. Required checks (lint, tests, canaries, type-check, coverage, dependency lock, impact gate) remain the merge authority per docs/adversarial-review.md proportionality.
🤖 **Headless spec gate (non-blocking, #204 first slice)**
Spec-gate agent produced no text output — check runner logs.
<details><summary>Deterministic floors still govern the merge</summary>
This comment is advisory. Required checks (lint, tests, canaries, type-check, coverage, dependency lock, impact gate) remain the merge authority per docs/adversarial-review.md proportionality.</details>
🤖Headless spec gate (non-blocking, #204 first slice)
Spec-gate agent produced no text output — check runner logs.
Deterministic floors still govern the merge
This comment is advisory. Required checks (lint, tests, canaries, type-check, coverage, dependency lock, impact gate) remain the merge authority per docs/adversarial-review.md proportionality.
🤖 **Headless spec gate (non-blocking, #204 first slice)**
Spec-gate agent produced no text output — check runner logs.
<details><summary>Deterministic floors still govern the merge</summary>
This comment is advisory. Required checks (lint, tests, canaries, type-check, coverage, dependency lock, impact gate) remain the merge authority per docs/adversarial-review.md proportionality.</details>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
PROV-1: deterministic Source Ledger (closes #282)
Branch
prov1-source-ledger, commit2da0afb. Deliberately boring: accepted OUTWARD artifact + receipts + persisted metadata → pure deterministic render → fixed Markdown template → idempotent Gitea comment.Hard boundaries implemented:
Real acceptance on #161 (legacy artifact, honest labels):
Idempotency proven: publish → created (comment 3510); publish again → UPDATED same comment. No duplicates.
14 ledger tests; full suite 1152 passed; ruff clean.
Ratification limitation 5 CLOSED. Epic #284: 3/5 limitations closed (#287, #286, #282); #298 ADAPT-9 outstanding; #288 accepted limitation.
🤖 Headless spec gate (non-blocking, #204 first slice)
Spec-gate agent produced no text output — check runner logs.
Deterministic floors still govern the merge
This comment is advisory. Required checks (lint, tests, canaries, type-check, coverage, dependency lock, impact gate) remain the merge authority per docs/adversarial-review.md proportionality.
🤖 Headless spec gate (non-blocking, #204 first slice)
Spec-gate agent produced no text output — check runner logs.
Deterministic floors still govern the merge
This comment is advisory. Required checks (lint, tests, canaries, type-check, coverage, dependency lock, impact gate) remain the merge authority per docs/adversarial-review.md proportionality.