Created
Jun 25, 05:49
Started
Jun 25, 12:29
Completed
Jun 25, 12:49
DevOps handoff
Type
Bug
Shape
backend
Worktree Slug
ship-pipeline-robustness-fixes
Repositories
mcritchie-studio
Release Train
—
Branch
feat/ship-pipeline-robustness-fixes
Local URL
—
QA URL
—
Production URL
—
Acceptance Criteria
Expected Test Plan
Checks Run
Agent Context
From conductor retro 2026-06-25 (ship of rel-20260624-b2f18e). FIX #1 (true ship-blocker): bin/release record_post_deploy_check (bin/release ~L375) builds a heroku-run rails-runner via conductor() that string-interpolates cmd.inspect into the shell; a post_deploy_cmd containing parens (seed-54: bin/rails runner "load Rails.root.join(%q(...)).to_s") produced /bin/bash: syntax error near unexpected token '(' -> conductor() abort! at ~L253 (record op returned no JSON) -> prepare aborted BEFORE assemble! (release stuck 'assembling') and would abort ship after prod-deploy+gem-publish. Make the conductor() rails-runner payload shell-safe (pass Ruby via stdin/heredoc or Shellwords.escape the whole -e arg) so ANY cmd records. Add an integration test feeding a paren/quote-laden cmd. FIX #2: the ship-preflight (Release::ShipSequence / repo_git_state parsing git status --porcelain) counts uncommitted generated artifacts as dirty and blocks the ff every ship: docs/agents/audits/retro-rel-*.md (bin/release retro output) + docs/agents/maintenance/delete-later.md (agent-worktree ledger). Ignore those known-generated paths (allowlist) OR --untracked-files=no for them; keep counting real code dirt. FIX #1b (dor-check): canonical post_deploy_cmd is 'bin/rails runner <path>' (rails runner takes a file path directly; paren-free). dor-check should SUGGEST/warn toward that form (not hard-reject existing valid cmds). Test tiers: unit for the quoting helper + dor-check matcher; integration for prepare-reaches-assemble with a paren cmd.
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.
Conductor CI-gate BLOCK (code APPROVED by Carl heavy + Jasper light; tests green locally 68/56/38 — but CI test job is RED). test_prepare_reaches_assemble_with_a_paren_post_deploy_cmd (release_cli_test.rb) runs in non-dry --yes mode and hits Dir.exist?(repo_path('turf-monster')) (~bin/release:692), so it false-fails on any checkout without sibling repos — i.e. CI (run 28150491553 test job failed). Same CI-portability class as the worktree-db #181 bug. FIX: make the test CI-portable — stub Dir.exist?/repo_path (or assert assemble-reach via --dry-run like the other prepare tests), confirm the CI 'test' job goes GREEN before resubmit. The 3 fixes themselves (base64 conductor_payload, preflight allowlist, dor-check suggestion) are correct + shippable once the test is portable. Minor: checks_run says dor_check_test 60 runs (actual 56); consider a one-line comment on the intentional double-base64 retro nesting.
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.