Operant Studio
OPER-211

OPER-QA-3 [Parent] Signal + TriageResult + RiskFactors + DecisionTask + PayoffLink primitive

Suggested
Justin Cooke

Body

---
feature_id: FEAT-studio-qa
size: L
module: intake
write_sets:
  - packages/database/prisma/schema/signals.prisma
  - packages/database/prisma/schema/tasks.prisma
  - packages/rbac/src/policies/signals.ts
phi_in_scope: true
has_migration: true
verification_cmd: pnpm --filter @operant/database db:migrate && pnpm --filter @operant/database test
---

## Context

Ratified [REDACTED-DOB] via PDT. Introduces the Signal primitive with autonomous triage and risk-tiered promotion. See project wiki `concepts/signal-triage-primitive.md` for the full spec.

This is the parent for the triage-automation ticket family:
- OPER-QA-3 (this) - Prisma models + RLS + AuditLog wiring
- OPER-QA-4 - triage agent implementation
- OPER-QA-5 - Insights project-scoped surface with Signals + Decisions views + shadow-mode audit dashboard

## Acceptance Criteria

- New Prisma models: Signal, TriageResult, RiskFactors (typed sub-model, not jsonb), DecisionTask (extends Task with kind=DECISION), PayoffLink
- Every model uses cuid() PKs and snake_case via @map()
- Every model is org-scoped via organization_id column with Postgres RLS per POR-291 pattern
- Fields that could carry PHI carry /// @PHI annotations (Signal.payload jsonb flagged; TriageResult.memo_markdown flagged)
- Every mutation writes an AuditLog row
- Migration is reversible and includes RLS policy grants
- Tests confirm cross-tenant reads return zero rows via getOrgScopedDb()

---
<!-- admission-passed-on-patch -->
**Admission re-checked on PATCH: PASS** -- feature FEAT-studio-qa admitted to product studio

---
<!-- planner-rescope: phi_no_reviewer -->
**Planner rescope (phi_no_reviewer):** Task has phiInScope=true but no PHI-eligible reviewer is available. Register a reviewer worker advertising the `phi` capability before admitting PHI work.

Attachments

Loading attachments…

Comments

Loading comments…