Agents Builders

Studio cable Redis primitive

Archived
studio-cable-redis

Created

Jun 24, 20:02

Started

Jun 24, 20:03

Completed

Jun 24, 22:32

DevOps handoff

Type

Feature

Shape

library

Worktree Slug

studio-cable-redis

Repositories

studio-engine

Release Train

2026-06-24-studio-cable

Branch

feat/studio-cable-redis

Local URL

QA URL

Production URL

realtime deploy

Acceptance Criteria

  • studio-engine declares the redis runtime dependency
  • Studio::Redis centralizes TLS-aware Redis connection options
  • safe_broadcast swallows StandardError and ScriptError
  • Studio::Broadcastable wraps Turbo broadcasts in the guard
  • docs capture Heroku readiness and SEV-1 lesson

Expected Test Plan

  • [unit] Studio::Redis TLS options + safe_broadcast ScriptError swallow
  • [integration] Broadcastable swallows a raising Turbo broadcast (dummy app)

Checks Run

  • [unit] Studio::Redis TLS options + Studio::Cable.safe_broadcast ScriptError-swallow green
  • [integration] Studio::Broadcastable swallows a raising broadcast + delegates args (stub model)
  • full engine suite 11 files 0 failures (ruby 3.3.11); gem builds 0.10.0 cleanly
  • note: bin/release-check spawns ruby 3.1 (agent-shell PATH gotcha); verified under 3.3.11 directly

Agent Context

Producer of release train 2026-06-24-studio-cable. Shared websocket/Redis primitive extracted after a SEV-1: mcritchie #171 shipped an ActionCable channel with no redis gem + no TLS cable config; the broadcast raised Gem::LoadError (a ScriptError, not StandardError) → escaped a rescue StandardError → 500'd every task write. Hotfixed in mcr (v114). This primitive prevents recurrence ecosystem-wide. API: Studio::Redis (.url/.tls?/.options with rediss ssl_params VERIFY_NONE), Studio::Cable.safe_broadcast (rescue StandardError, ScriptError), Studio::Broadcastable concern (safe Turbo broadcast wrappers). Base off origin/release (0.9.0 Enumeral); bump to 0.10.0. Operator decisions: both apps converge on Turbo Streams; engine first, mcr adopts next via local path (bundle config set --local local.studio), Turf refactor later. Do not publish gem (operator gate).

Stage Timeline

Who handled each stage, the time it took (measured), and the model / tokens / cost reported (best-effort) — plus who's on it right now. means the agent didn't report that metric.

  1. Created Designed
    G Golem
    Golem
    Model
    Duration
    Tokens
    Cost
    Completed Jun 24, 20:02 · 3 days ago
    api
  2. Designed Building
    G Golem
    Golem
    Model
    claude-opus-4-8
    Duration
    under a minute
    Tokens
    Cost
    Started Jun 24, 20:02
    Completed Jun 24, 20:03 · 3 days ago
    cli
  3. Building Submitted
    G Golem
    Golem
    Model
    claude-opus-4-8
    Duration
    10 minutes
    Tokens
    Cost
    Started Jun 24, 20:03
    Completed Jun 24, 20:13 · 3 days ago
    cli
  4. Submitted Reviewed
    C Carl
    Carl primary
    J Jasper
    Jasper light
    Model
    claude-opus-4-8
    Duration
    about 2 hours
    Tokens
    50,401,256
    Cost
    ~$46.76
    Started Jun 24, 20:13
    Completed Jun 24, 22:14 · 2 days ago
    cli
  5. Reviewed Assembled
    S Steffon
    Steffon
    Model
    Duration
    10 minutes
    Tokens
    Cost
    Started Jun 24, 22:14
    Completed Jun 24, 22:24 · 2 days ago
  6. Assembled Shipped
    3
    317190da-2cf6-42fc-9204-eb1706b0e78c
    Model
    claude-opus-4-8
    Duration
    8 minutes
    Tokens
    30,937,718
    Cost
    ~$19.80
    Started Jun 24, 22:24
    Completed Jun 24, 22:32 · 2 days ago
    cli
  7. Shipped Archived
    8
    81fad33e-98b5-4075-8ed6-d0efe6cb5804
    Model
    claude-opus-4-8
    Duration
    about 23 hours
    Tokens
    Cost
    Started Jun 24, 22:32
    Completed Jun 25, 21:16 · 1 day ago
    cli

Conversation

QA review feedback, agent handoffs, and follow-up notes for this task.

Handoff 3 days ago

Hardening (commit bf9cb62, same PR #9, no version bump): Studio::Cable.safe_broadcast now wraps its OWN error-logging in a rescue — ErrorLog.capture! writes to the DB and can itself raise (e.g. ActiveRecord::NoDatabaseError when the DB is down), which would have escaped the guard and defeated the never-raise guarantee. Added the regression test (guard-for-the-guard): returns nil, never raises, even when the error path itself raises. Full engine suite still green (11 files, 0 failures; cable test 4 runs). Engine has no rubocop config — gate is bin/release-check (ruby -c + suite); syntax clean.

Sealed-bid sizing

Edit →

Alex (PM)

Avi (PO)

Dev

Actual