Viska · wr-viska-main · 2026-06-28
Two agents, one demo day.
ViskaMimir (Mastra layer) — shipping research INTO Slack, plus a self-waking event agent.
Room: wr-viska-main · spoke ViskaMimir (0.3) under viska-pm (0.0) · demo target 2026-06-29
Status board
D2 · research → Slack
POST /api/research
E2E proven
prod: 1 /invite away
- 10 tests · 1224→1264 suite green
- staging E2E landed real research
- prod live, awaiting bot invite to #feed
Event-Watch agent
self-wake → research → 'Live'
built · green
frozen pre-demo
- 40 module tests + 10/10 regression
- commit fc9a4a7 (local)
- delivers to 'Live' C0BDRSQRADP
Research-Personas
T12 lens fleet
specced
awaiting go
- 5 lenses, one msg per lens
- resolves mimir-016 (unified builder)
- shares postResearch + runResearch
D2 — the delivery lane (proven)
ViskaRes pipeline
→
POST /api/research
Bearer auth · rule #19
→
buildResearchBlocks
grounded · EN
→
chat.postMessage
→
Slack #feed
Staging E2E — real ViskaRes payload (5 sections · 8 sources)200 OK
channelC09F44U5BAP (#feed)
ts1782648418.195299
render11 Block Kit blocks, all under limits
The deploy saga — hurdles cleared
| Hurdle | Root cause | Resolution |
| develop push didn't deploy staging | mimir-staging is railway-up upload-only, not github-tracked (stuck on 06-17 image) | railway up the 4e09e86 tree (hades token) |
| credless pane couldn't push / deploy / POST | Slack + secret + railway env all UNSET in pane | hades value-safe sourced env-files (push, secret, railway, bot) — never in context |
| prod landed in a DM, not #feed | prod ALLOWED_CHANNEL_ID = D0A1DATUMT2 (a DM) | hades repointed → C09F44U5BAP (#feed) + redeploy |
| prod POST → channel_not_found | prod bot not a member of #feed | human /invite @mimir (U0A0NJJ2QUC) — pending |
How the arc ran
Built D2 endpoint (TDD)
POST /api/research — auth → validate → render → post. Commit 446e50c, 10 tests.
Pushed develop via viska-pm App token
446e50c → develop 4e09e86 (viska-pm-app[bot]); Mímir never pushes with its own identity.
Staging stale — root-caused
upload-only service; railway up the tree instead. Endpoint went live.
Staging E2E proven
real ViskaRes research landed in #feed. ViskaRes confirmed the canonical lane.
Promoted to prod — PR #54 merged
prod is github-tracked → auto-deployed. No railway up.
Prod channel + membership gaps
DM→#feed fixed; bot needs a human /invite (flagged, not overclaimed).
Event-Watch agent built in parallel
spawn-first sub-agent (isolated worktree) + my entities fix. 40 tests + regression green. fc9a4a7.
Holding
armed for the D2 re-POST the instant @mimir is invited to #feed.
Event-Watch — the second agent
/mimir watch "<event>" <when>
→
countdown
Supabase registry
→
scheduler wakes on fire
→
research-on-fire
news · transcripts · data
→
postResearch
→
Slack 'Live'
Shipped
- fully dependency-injected (testable, no clock/network in tests)
- in-process scheduler + optional POST /api/events/tick
- durable registry — restart-safe
- shared postResearch() core (D2 + personas + events)
To go live (post-demo)
- viska-pm relay fc9a4a7 → develop
- apply sql/mimir_watched_events.sql (operator)
- promote module beta → active
- register a Viska event → real test run
Discipline notes
- No overclaim. Prod POST returned 200 but to a DM — flagged as a wrong-channel gate, not reported as "#feed delivered."
- Credential isolation. Every token (push, secret, railway, bot) sourced from value-safe env-files — never read into context; auth.test returns identity only.
- Spawn-first. The event-watch build ran off-thread in an isolated worktree, keeping the main thread free to drive the D2 prod arc.
- Right identity. Pushes route through viska-pm App token (viska-pm-app[bot]); Mímir commits local, never pushes with its own hand.