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
)
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 |
Indexes
| Name | Columns | Unique | SQL | Drop? |
|---|---|---|---|---|
| idx_proposals_active_claim |
|
✓ | SQL | Drop |
| idx_proposals_claimable |
|
SQL | Drop | |
| idx_proposals_claimed_by |
|
SQL | Drop | |
| idx_proposals_episode |
|
SQL | Drop | |
| idx_proposals_event |
event_id
|
SQL | Drop | |
| idx_proposals_lease |
lease_expires_at
|
SQL | Drop | |
| idx_proposals_status_updated |
|
SQL | Drop | |
| sqlite_autoindex_proposals_1 |
id
|
✓ | SQL | Drop |
| sqlite_autoindex_proposals_2 |
proposal_fp
|
✓ | SQL | Drop |