WI-014 · Platform & Contracts · ingestion-contract
done P0 high risk Owner: Paul 100% · 5/5 tasks complete
Enforce the load-bearing rule: promoteInventoryCandidate() is the ONLY path into canonical inventory; everything else writes candidates + events (ARCHITECTURE.md).
Spec (docs/specs/P5)
Build (core)
Test (keyless)
Freeze (§37)
Gap-resolution expansion (D26, 2026-06-20)
The one-door flow (connection→run→record→candidate→review→promotion) is contracted; promoteInventoryCandidate() is the only external→canonical writer, atomic + idempotent, version-checked, seller-review-gated; raw payloads immutable + normalization versioned; layered dedup (source-native idempotency / fingerprint / similarity suggestions, no silent merge); item+field provenance survives later edits; append-only plugin_events; connector/MCP/harness/buyer permission matrix (candidate+event writes only); deterministic contract + permission-boundary tests. Per spec §34/§35 (core rows). Unblocks P6 + Spine. §37 reconciliations before freeze.
No paid API / infra spend triggered by this item.
done Sprint: P&C Wave 1: Foundations
Edit status / sprint on the ★ Live Board → — changes are logged live with who / when / why.
No human tasks linked.
None recorded yet.
None recorded yet.
None recorded yet.
No files / artifacts recorded.
Added the keyless @trovesnap/ingestion-contract package with the P5 logical one-door flow: source connection → import run → immutable source record + normalized version → inventory candidate → seller review → promoteInventoryCandidate(). The reference promotion service is seller-review-gated, candidate-version-checked, idempotent via the P9 platform convention, duplicate-aware without silent merge, and records item/field provenance plus append-only plugin events. P6 still owns the physical PostgreSQL schema/RLS/grants/RPC enforcement.
| Check | Result | Evidence |
|---|---|---|
| P5 package tests | PASS | 7/7 node:test cases: traceability, direct-write rejection, promotion idempotency, source idempotency, duplicate no-auto-merge, credential redaction, stale-review atomicity |
| Keyless CI floor | PASS | scan-contracts + platform + ingestion-contract + quarantine report, no secrets used |
| Platform idempotency convention | PASS | P5 uses `idempotencyScope`/`idempotencyHash`; unsafe source-native IDs are normalized to colon-free scoped keys |
| Live Board promotion | PASS | WI-014 promoted queued → done with `tracker-promote` audit actor Codex |