Agents Builders

Ship pipeline robustness fixes

Archived
ship-pipeline-robustness-fixes

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

devops deploy-safety release-tooling

Acceptance Criteria

  • post_deploy_cmd with parens or quotes records safely
  • prepare completes assemble after recording post-deploy check
  • ship-preflight ignores generated audit and ledger artifacts
  • dor-check suggests canonical rails runner file-path form

Expected Test Plan

  • [unit] conductor record payload shell-safe with parens
  • [integration] prepare assembles after paren post_deploy_cmd

Checks Run

  • [review] Carl (heavy, +re-verify) APPROVE + Jasper (light) APPROVE — base64 conductor_payload + preflight artifact allowlist + dor-check suggestion (68/56/38 green); rework made paren test CI-portable (repo_path->Dir.pwd stub), CI GREEN run 28170480235 all 4 jobs on 9e4b0dde

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.

  1. Created Designed
    N Ninetales
    Ninetales
    Model
    Duration
    Tokens
    Cost
    Completed Jun 25, 05:49 · 2 days ago
    api
  2. Designed Building
    N Ninetales
    Ninetales
    Model
    claude-opus-4-8
    Duration
    2 minutes
    Tokens
    Cost
    Started Jun 25, 05:49
    Completed Jun 25, 05:50 · 2 days ago
    cli
  3. Building Submitted
    N Ninetales
    Ninetales
    Model
    claude-opus-4-8
    Duration
    17 minutes
    Tokens
    Cost
    Started Jun 25, 05:50
    Completed Jun 25, 06:07 · 2 days ago
    cli
  4. Submitted Blocked
    Model
    Duration
    about 6 hours
    Tokens
    Cost
    Started Jun 25, 06:07
    Completed Jun 25, 12:07 · 2 days ago
    api
  5. Blocked Building
    N Ninetales
    Ninetales
    Model
    claude-opus-4-8
    Duration
    22 minutes
    Tokens
    59,488,559
    Cost
    ~$44.85
    Started Jun 25, 12:07
    Completed Jun 25, 12:29 · 2 days ago
    cli
  6. Building Submitted
    N Ninetales
    Ninetales
    Model
    claude-opus-4-8
    Duration
    8 minutes
    Tokens
    Cost
    Started Jun 25, 12:29
    Completed Jun 25, 12:38 · 2 days ago
    cli
  7. Submitted Reviewed
    C Carl
    Carl 2
    J Jasper
    Jasper 1
    Model
    claude-opus-4-8
    Duration
    3 minutes
    Tokens
    4,676,608
    Cost
    ~$2.74
    Started Jun 25, 12:38
    Completed Jun 25, 12:40 · 2 days ago
    cli
  8. Reviewed Assembled
    S Steffon
    Steffon
    Model
    Duration
    under a minute
    Tokens
    Cost
    Started Jun 25, 12:40
    Completed Jun 25, 12:41 · 2 days ago
  9. Assembled Shipped
    A Avi
    Avi
    Model
    Duration
    8 minutes
    Tokens
    Cost
    Started Jun 25, 12:41
    Completed Jun 25, 12:49 · 2 days ago
  10. Shipped Archived
    8
    81fad33e-98b5-4075-8ed6-d0efe6cb5804
    Model
    claude-opus-4-8
    Duration
    about 8 hours
    Tokens
    Cost
    Started Jun 25, 12:49
    Completed Jun 25, 21:16 · 1 day ago
    cli

Conversation

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

QA Feedback 2 days ago

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