SQL

CREATE TABLE proposals  (
  id TEXT PRIMARY KEY,
  episode_id TEXT,
  event_id TEXT,
  -- triggering event (usually user_interaction or signal_ingest)
  status TEXT NOT NULL CHECK (status IN (
    'new','claimed','accepted','rejected','needs_followup','superseded','applied','failed'
  )),
  kind TEXT NOT NULL,
  -- 'triage'|'plan'|'explain'|'capture' etc.
  model TEXT,
  -- which model produced it
  prompt_fp TEXT,
  -- fingerprint of the context+prompt (for debugging)
  proposal_fp TEXT NOT NULL UNIQUE,
  -- canonical hash of proposal JSON (idempotency)
  -- human-readable metadata (optional)
  summary TEXT,
  rationale TEXT,
  risk TEXT,
  -- the actual proposal contents
  payload TEXT NOT NULL,
  -- JSON: fact_ops[],
  commitment_ops[],
  inbox_ops[],
  action_candidates[],
  followups[]
  -- durable claiming / leasing for daemons
  claim_id TEXT,
  -- unique id for this claim attempt
  claimed_by TEXT,
  -- daemon/worker id
  claimed_at TEXT,
  lease_expires_at TEXT,
  -- claim lease expiry; daemon must renew or release
  -- terminal bookkeeping (helps UX + debugging)
  accepted_at TEXT,
  rejected_at TEXT,
  applied_at TEXT,
  failed_at TEXT,
  superseded_by TEXT,
  -- proposal_id that superseded this one (optional)
  -- error/debug
  last_error TEXT,
  attempt_count INTEGER NOT NULL DEFAULT 0,
  created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
  updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
  FOREIGN KEY (episode_id) REFERENCES episodes(id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED,
  FOREIGN KEY (event_id) REFERENCES events(id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED,
  FOREIGN KEY (superseded_by) REFERENCES proposals(id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED
)

+ Add column

Columns

Column Data type Allow null Primary key Actions
id TEXT Rename | Drop
episode_id TEXT Rename | Drop
event_id TEXT Rename | Drop
status TEXT Rename | Drop
kind TEXT Rename | Drop
model TEXT Rename | Drop
prompt_fp TEXT Rename | Drop
proposal_fp TEXT Rename | Drop
summary TEXT Rename | Drop
rationale TEXT Rename | Drop
risk TEXT Rename | Drop
payload TEXT Rename | Drop
claim_id TEXT Rename | Drop
claimed_by TEXT Rename | Drop
claimed_at TEXT Rename | Drop
lease_expires_at TEXT Rename | Drop
accepted_at TEXT Rename | Drop
rejected_at TEXT Rename | Drop
applied_at TEXT Rename | Drop
failed_at TEXT Rename | Drop
superseded_by TEXT Rename | Drop
last_error TEXT Rename | Drop
attempt_count INTEGER Rename | Drop
created_at TEXT Rename | Drop
updated_at TEXT Rename | Drop

Foreign Keys

Column Destination
superseded_by proposals.id
event_id events.id
episode_id episodes.id

+ Add index

Indexes

Name Columns Unique SQL Drop?
idx_proposals_active_claim
  • id
  • claim_id
SQL
CREATE UNIQUE INDEX idx_proposals_active_claim
ON proposals (id, claim_id)
Drop
idx_proposals_claimable
  • status
  • kind
  • lease_expires_at
  • updated_at
SQL
CREATE INDEX idx_proposals_claimable
ON proposals (status, kind, lease_expires_at, updated_at)
Drop
idx_proposals_claimed_by
  • claimed_by
  • status
  • updated_at
SQL
CREATE INDEX idx_proposals_claimed_by
ON proposals (claimed_by, status, updated_at DESC)
Drop
idx_proposals_episode
  • episode_id
  • updated_at
SQL
CREATE INDEX idx_proposals_episode
ON proposals (episode_id, updated_at DESC)
Drop
idx_proposals_event event_id SQL
CREATE INDEX idx_proposals_event
ON proposals (event_id)
Drop
idx_proposals_lease lease_expires_at SQL
CREATE INDEX idx_proposals_lease
ON proposals (lease_expires_at)
Drop
idx_proposals_status_updated
  • status
  • updated_at
SQL
CREATE INDEX idx_proposals_status_updated
ON proposals (status, updated_at DESC)
Drop
sqlite_autoindex_proposals_1 id SQL
-- no sql found --
Drop
sqlite_autoindex_proposals_2 proposal_fp SQL
-- no sql found --
Drop