Created
Jun 23, 20:01
Started
Jun 23, 20:58
Completed
Jun 23, 21:51
DevOps handoff
Type
Bug
Shape
backend
Worktree Slug
fix-retro-heroku-run-escaping
Repositories
mcritchie-studio
Release Train
—
Branch
feat/fix-retro-heroku-run-escaping
Local URL
—
QA URL
—
Production URL
—
Acceptance Criteria
Expected Test Plan
Checks Run
Agent Context
Found by dogfooding bin/release retro on rel-20260623-ba72f5 right after shipping #130. The conductor helper interpolates the answers JSON as an escaped Ruby string into 'rails runner "..."' and runs it via heroku run; heroku run's arg handling eats the \" escaping so the remote receives mangled JSON. Two repros on PROD board: (a) answers with parens -> remote bash 'syntax error near unexpected token (' ; (b) EVEN empty answers -> JSON::ParserError 'got worked:[],riction:[],ollowups:' (quotes + leading f eaten). Tests passed because they hit Release::Retro directly + the local CLI path, never the real heroku-run quoting round-trip. Fix: stop string-interpolating the payload into rails runner; pass it shell-safe — base64-encode the JSON and decode remotely, or via ENV, or stdin — and add a test that exercises the actual conductor/heroku-run command construction. Same shell-boundary class as the post-deploy --exit-code/Shellwords findings.
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.
Conversation
QA review feedback, agent handoffs, and follow-up notes for this task.
2-senior PASS: jasper (HEAVY) approve — Base64 round-trip exact for quotes/parens/&&/pipes/backticks/unicode/newlines/60KB, urlsafe never line-wraps, survives bash -c reparse; other conductor callers untouched (slug-shaped .inspect only); fail-first genuine (4 RED pre-fix), tests assert command construction. alex-docs (LIGHT) approve — stale 'safe inspected literal' comment replaced. DEFERRED non-blocking nits: one vacuous refute_includes("worked":) assertion (real guards are the &&/pipe/Base64 ones); add require 'base64' to the remote snippet defensively; Base64 ~33% size inflation (fine for real retro text).
Sealed-bid sizing
Edit →Alex (PM)
—
Avi (PO)
—
Dev
—
Actual
—
We emailed a one-tap sign-in link to . It expires shortly and can only be used once.
No email? Check spam, or close this and try again.