Viska Council · Workstream A

Council Signals Schema & Feeds

The data plane for the Viska Council agent-ensemble — the schema, access-control roles, and ingestion that capture face-agents' trading "takes" into a queryable, scored, RLS-guarded record.

Status Authoring done · closing E2E Branch feat/wsa-signals-schema @12d8166 Class C (schema/migration) Owner viska-pm %0 (backend)

01 What the arc is

The Council is Viska's agent-ensemble: face-agents that reason over market + corpus context and emit takes — buy/sell/hold convictions with rationale. WS-A is the persistence + access layer that makes those takes real: a signals schema holding the universe, market data, run records, backtests, and the takes themselves, plus two scoreboard views. It feeds Muninn a real track record and unblocks the downstream research-findings writer.

Data model

Council → takes → score

Agents run → emit takes into signals.takes. Runtime role reads scoreboard views + inserts takes only. Engine role does orchestration writes. RLS enforces staff-read.

Why now

In-progress child of trading-intel arc

EOD engine + signals feed the live track record. T0 proved the research/corpus schemas were absent → they became build deliverables, not blockers.

02 Task breakdown

TaskScopeState
T0Prod gate — do research + corpus schemas exist? (spec = hypothesis)✅ ABSENT → deliverable
T1Signals migration20260615-01-signals_schema.sql, C1 DDL verbatim + TSX amendment + source_symbol✅ authored
T2Roles + RLS20260615-02-signals_rls.sql; viska_council_rt + engine role; prod-apply via Hades✅ authored
T3n8n flows — candle loader (inactive, provider pending), nightly engine trigger, corpus re-embed watcher (verified-only, default-deny)✅ nightly
T4Findings writer — sweep findings → research rows (ViskaRes README @00651fd)🔒 research schema absent
T5Take-grading owner — n8n vs Mastra workflow; record pick in .donepick at build

03 C1 contract & locked amendments

C1 DDL (LOCKED, verbatim)

signals.*

  • universe · market_candles / fundamentals / calendar
  • signal_runs · backtest_runs · takes
  • 2 views incl. v_takes_scoreboard
Amendments

TSX + raw symbol

  • exchange CHECK ('US','LSE') → add 'TSX' (held LUN trades TSX; 018 flagged)
  • raw RIOl → ticker RIO/LSE; keep raw as source_symbol
Any deviation from C1 routes back to viska-pm before building — the contract is locked.

04 Roles & access model

runtime

viska_council_rt

SELECT scoreboard views + INSERT takes only. Nothing else. Negative test must FAIL: INSERT on signal_runs as this role.

orchestration

engine role name?

INSERT signal_runs/backtest_runs + SELECT market_*. Confirm canonical name viska_council_engine (C1 left it unnamed). RLS = staff-read.

05 Finalization mandate — from %5 (wr-viska-live coord), 13:56Z

Operator ruling (no-blocker mandate): research + corpus schema build = AUTHORIZED as WS-A deliverable. T0 made them deliverables, not prereqs. Build → unblock T4. No separate ratification.

Backend coordinator %0 — close end-to-end (own GH-write + room routing):

  1. Push feat/wsa-signals-schema @12d8166 + open PR — vpmgh. Class C. Pool for single heph review.
  2. Prod-apply via Hades: both migrations + roles viska_council_rt + engine (confirm name) + RLS-vs-GRANT INSERT mechanism.
  3. Dispatch ViskaDB %3: author research + corpus schema migration → then T4 findings writer.
  4. Acceptance: select * from signals.v_takes_scoreboard → empty (NOT error); negative INSERT as viska_council_rt → FAILS.
  5. Board child PVTI_lADOELFdl84BZve-zgvhB6E updated; final .done addendum.

06 Close plan & sequencing (this room)

fetch 12d8166 vpmgh push + PR heph review (Class C) rebase-merge Hades %41 prod-apply acceptance board #?

Parallel: after merge, ViskaDB %3 builds research/corpus schemas + T4 writer alongside acceptance. Hades pane %41 is live in-room — prod-apply uses it directly (no async summon), once it finishes the CF-token deposit it's on.

Open reconciliations:
  • Branch 12d8166 is unpushed (lives in wt-viska-backend-ViskaDB clone) — fetch into vpmgh-authed clone before push.
  • STATE.md mislabels merged PR#7 as "WS-A signals schema" — #7 is sharding substrate. WS-A is unmerged. (Correct at /client-end.)
  • Board routing: dispatch says Board #3 / trading-intel epic; CLAUDE.md maps WS-A to Board #9 Council. PVTI node-id is authoritative — verify before T5 edit.
  • Class-C review: only 1 PR pooled now → summon heph for it, or async fallback (operator call).

07 Success criteria & constraints

Success
  • Migration applied prod; v_takes_scoreboard → empty (not error)
  • Negative INSERT on signal_runs as viska_council_rt → FAILS
  • n8n flows staged (loader inactive until provider pick)
  • C1 honored verbatim + TSX amendment
  • Board child updated; dispatch → .done w/ addendum
Constraints
  • PR-required; direct push to main BLOCKED; squash disallowed (rebase-merge only)
  • Prod-apply via Hades; provider key (when picked) → Hades, never inline
  • Rule 05: ViskaDB/ViskaN8N write Viska-Wiki, never Aion/fleet

08 Lineage

spec_Viska-PM/docs/specs/2026-06-11-viska-council-agent-platform.md @eebe33b plan_Viska-PM/docs/plans/2026-06-11-viska-council-implementation.md (Part 1 C1 LOCKED) handoff_handoff/2026-06-12_viska-pm-to-viska-pm_council-ws-a-signals-schema.md dispatchcross-room route, created 2026-06-15T10:07Z; finalized 13:56Z boardchild PVTI_lADOELFdl84BZve-zgvhB6E (board # under verification) decisions[[viska-ssot-shard-isolation]] · [[corpus-ingestion-gate]] · [[pantheon-vault-pwd-gate-client-isolation]]