Transition seed lifecycle state
Apply a lifecycle transition (e.g. raw → triaged, triaged → rejected). Legal edges enforced by the lifecycle store; illegal edges return 409.
Path Parameters
Body
Body of PATCH .../seeds/{seed_id}.
The transition target plus optional metadata. Legal edges are enforced
by :meth:SeedLifecycleStore.transition against the (from, to) matrix
- this route does NOT validate them client-side.
Response
Updated seed record
Response shape for a single seed row.
A thin projection over :class:StorySeedRecord - JSONB columns
surface as dict so dashboards can render them without a second
round-trip; large list views can slim this down later if needed.
The 6 seed lifecycle states.
Source: mechanics/lifecycle-state-machine.md §1 - wire-form values
match the DB CHECK (state IN ('raw',...)) exactly.
raw, triaged, promoted, used, rejected, dead Discrete provenance vocabulary (5 values) per R4 R127-C1.
Source of truth:
docs/design/concepts/green-source-scout/mechanics/provenance-contract.md§2docs/design/concepts/seed-lifecycle-store/mechanics/schema.md(CHECK constraint)docs/design/concepts/story-seed-object/design.md§3.1
Notable absence: there is NO scraped value - the gate enforces by
absence. The DB-level CHECK constraint lists exactly these five.
generated, public-domain, licensed, opt-in, operator-inspired Controlled risk-flag vocabulary (C-SSD-7 contract §2).
ANY flag set on a seed → mandatory human review (cannot auto-promote).
Stored as TEXT[] with a GIN index so the SC8 audit
(WHERE risk_flags @> ARRAY[...]) is a single index scan.
Source: docs/design/concepts/green-source-scout/mechanics/provenance-contract.md §2.
pii-present, sensitive-data, identifiable-real-event, copyrighted-phrasing-detected, platform-restriction, minor-or-sensitive-subject