MasteryMade · Infrastructure PRD

PRD 10: Forge Session Logger + Runtime Migration

PRD 10 of 12 Depends: PRD 1
Parent: Master Registry v1.0 — Section 10 · Owner: Lane A

10.1 Purpose

Close the archive gap keeping Claude.ai as primary. Every Forge interaction gets a session ID, full transcript to Supabase, entities/topics extracted, optionally published to NowPage. Once this exists, Forge becomes primary for everything.

10.2 Schema: sessions

CREATE TABLE sessions (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  session_type TEXT NOT NULL CHECK (session_type IN (
    'forge_interactive','forge_autonomous','claude_code','telegram_bot','voice_agent','api_consumer'
  )),
  initiated_by TEXT NOT NULL,
  runtime TEXT NOT NULL,
  title TEXT,
  transcript TEXT NOT NULL,
  summary TEXT,
  entities_mentioned UUID[],
  topics TEXT[],
  decisions_made JSONB,  -- [{decision,rationale,reversible}]
  action_items JSONB,    -- [{item,owner,deadline}]
  gate INT,
  related_sessions UUID[],
  skills_used TEXT[],
  published_url TEXT,
  published_at TIMESTAMPTZ,
  started_at TIMESTAMPTZ NOT NULL,
  ended_at TIMESTAMPTZ,
  duration_seconds INT,
  created_at TIMESTAMPTZ DEFAULT now()
);

CREATE INDEX idx_sessions_started ON sessions(started_at DESC);
CREATE INDEX idx_sessions_topics ON sessions USING gin(topics);
CREATE INDEX idx_sessions_entities ON sessions USING gin(entities_mentioned);
CREATE INDEX idx_sessions_transcript ON sessions
  USING gin(to_tsvector('english', coalesce(title,'') || ' ' || transcript));
ALTER TABLE sessions ADD COLUMN summary_embedding vector(1536);

10.3 Session Lifecycle (n8n)

Session Starts → generate session_id → begin transcript capture
During → append to buffer → track skills invoked
Session Ends (idle timeout / explicit /end / cron)
  → Webhook to n8n:
    1. Store raw transcript
    2. AI summary (Claude Haiku — cheap, fast)
    3. Entity extraction (match against entities table)
    4. Topic extraction (keyword + embedding classification)
    5. Decision/action item extraction
    6. Gate classification
    7. Register in org registry changelog
    8. OPTIONAL: Publish to NowPage if marked publishable
    9. Telegram: "Session logged. N decisions, N action items."

10.4 Search

Full-text search

CREATE FUNCTION search_sessions(p_query TEXT, p_limit INT DEFAULT 20, p_after TIMESTAMPTZ DEFAULT NULL)
RETURNS SETOF sessions AS $$
  SELECT * FROM sessions
  WHERE to_tsvector('english', coalesce(title,'') || ' ' || transcript)
        @@ plainto_tsquery('english', p_query)
    AND (p_after IS NULL OR started_at >= p_after)
  ORDER BY ts_rank(...) DESC LIMIT p_limit;
$$ LANGUAGE sql;

Semantic search

CREATE FUNCTION semantic_search_sessions(p_embedding vector(1536), p_limit INT DEFAULT 10)
RETURNS SETOF sessions AS $$
  SELECT * FROM sessions WHERE summary_embedding IS NOT NULL
  ORDER BY summary_embedding <=> p_embedding LIMIT p_limit;
$$ LANGUAGE sql;

10.5 Claude.ai → Forge Migration

FunctionCurrentTarget
Daily briefsManual in Claude.aiAutonomous on Forge (PRD 6)
NowPage publishingClaude.ai MCPForge direct + n8n
Session archivalClaude.ai nativeForge → Supabase sessions
Skill executionClaude.ai skill loadingForge MANUAL.md loading
Meeting processingManual uploadFireflies webhook → Forge

What stays on Claude.ai: Interactive brainstorming (conversation UX better for exploration). Past chat search for pre-migration history. File creation/editing (compute sandbox).

Timeline

Now: Session logger built. All new Forge sessions archived. Week 2: Daily briefs + NowPage publishing move to Forge. Week 4: Meeting processing automated via Fireflies webhook. Ongoing: Claude.ai for interactive work. Forge is system of record.

10.6 Acceptance Criteria

MASTERYMADE — PRD 10 of 12

Dominia Facta. Build what compounds.