Agents Builders

Post-deploy command hook

Archived
post-deploy-cmd-hook

Created

Jun 23, 18:36

Started

Jun 23, 19:16

Completed

Jun 23, 19:57

DevOps handoff

Type

Feature

Shape

backend

Worktree Slug

post-deploy-cmd-hook

Repositories

mcritchie-studio

Release Train

Branch

feat/post-deploy-cmd-hook

Local URL

QA URL

Production URL

deploy tooling

Acceptance Criteria

  • devops.post_deploy_cmd runs on QA during prepare
  • same command runs on prod during ship
  • run recorded to checks_run, failure aborts deploy
  • idempotent re-run resumes the deploy cleanly

Expected Test Plan

  • unit
  • integration

Checks Run

  • [unit] release_cli: dry-run print asserts heroku --exit-code + -- (QA & prod)
  • [unit] release_cli: abort test echoes EXECUTED argv, asserts --exit-code
  • [unit] release_cli: Shellwords split keeps quoted arg, -- terminates flags
  • [integration] release/post_deploy + conductor model tests green (104 runs)

Agent Context

REWORK done: rebased onto origin/release (kept PR130 retro + PR131 qa-intake); fixed carl blocker (--exit-code) + Shellwords/-- guard + dry-run/exec parity + exec-argv --exit-code assertion + intentional-abort comment; partial-ship resume tolerates already-live gems (ship_gem skip-if-live).

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
    D Dratini
    Dratini
    Model
    Duration
    Tokens
    Cost
    Completed Jun 23, 18:36 · 4 days ago
    api
  2. Designed Building
    D Dratini
    Dratini
    Model
    claude-opus-4-8
    Duration
    2 minutes
    Tokens
    Cost
    Started Jun 23, 18:36
    Completed Jun 23, 18:38 · 4 days ago
    cli
  3. Building Submitted
    D Dratini
    Dratini
    Model
    claude-opus-4-8
    Duration
    27 minutes
    Tokens
    2,358,442
    Cost
    ~$2.91
    Started Jun 23, 18:38
    Completed Jun 23, 19:04 · 4 days ago
    cli
  4. Submitted Blocked
    Model
    Duration
    6 minutes
    Tokens
    Cost
    Started Jun 23, 19:04
    Completed Jun 23, 19:10 · 4 days ago
    api
  5. Blocked Building
    D Dratini
    Dratini
    Model
    claude-opus-4-8
    Duration
    6 minutes
    Tokens
    7,176,682
    Cost
    ~$7.57
    Started Jun 23, 19:10
    Completed Jun 23, 19:16 · 4 days ago
    cli
  6. Building Submitted
    D Dratini
    Dratini
    Model
    claude-opus-4-8
    Duration
    14 minutes
    Tokens
    6,398,812
    Cost
    ~$6.74
    Started Jun 23, 19:16
    Completed Jun 23, 19:31 · 4 days ago
    cli
  7. Submitted Reviewed
    C Carl
    Carl primary
    A Alex
    Alex light
    Model
    claude-opus-4-8
    Duration
    6 minutes
    Tokens
    Cost
    Started Jun 23, 19:31
    Completed Jun 23, 19:37 · 4 days ago
    cli
  8. Reviewed Assembled
    S Steffon
    Steffon
    Model
    Duration
    under a minute
    Tokens
    Cost
    Started Jun 23, 19:37
    Completed Jun 23, 19:37 · 4 days ago
  9. Assembled Shipped
    A Avi
    Avi
    Model
    Duration
    20 minutes
    Tokens
    Cost
    Started Jun 23, 19:37
    Completed Jun 23, 19:57 · 4 days ago
  10. Shipped Archived
    Model
    Duration
    about 8 hours
    Tokens
    Cost
    Started Jun 23, 19:57
    Completed Jun 24, 03:44 · 3 days ago

Conversation

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

QA Feedback avi 4 days ago

2-senior review: carl (HEAVY) REQUEST_CHANGES; shannon (LIGHT) approve-with-concern. Fix before resubmit: (1) BLOCKER bin/release ~254: heroku run lacks --exit-code, so it returns 0 once the dyno LAUNCHES regardless of remote success — abort-on-failure never fires on QA or prod; a failing cmd records '-> ok' and the release proceeds. Add --exit-code. (2) MAJOR test/lib/release_cli_test.rb ~466: abort test stubs sh->false, sidestepping real exit semantics (why the blocker passed CI). Add an assertion that the emitted heroku command includes --exit-code (dry-run print test can assert it); keep the stubbed-abort test for branch coverage. (3) MINOR bin/release ~254: *cmd.split is naive whitespace split — mangles quoted args AND lets a task-declared cmd inject heroku flags, and the dry-run print diverges from what executes. Use Shellwords.split(cmd) and put a -- separator before the command tokens. (4) NIT: the unroutable-app abort runs before the DRY guard, so --dry-run can exit nonzero — guard it or add an intentional-comment. (5) Confirm a ship re-run after a post-deploy failure tolerates already-published gems (partial-ship resume).

QA Feedback avi 4 days ago

Rework RE-REVIEW PASS: carl (HEAVY) approve — all 5 resolved: BLOCKER --exit-code now in executed argv (test pins it to the real sh argv, not just dry-run print); MAJOR abort test independently proves --exit-code + right app + ABORTED; MINOR Shellwords.split + -- terminator, single heroku_argv drives both dry-run and exec; NIT unroutable-app abort documented intentional; ship re-run tolerates already-published gems (verified in code). No new issues from the #130 rebase; 104 runs green. shannon (LIGHT) approve. Non-blocking: printed join renders spaced args unquoted (cosmetic).

Sealed-bid sizing

Edit →

Alex (PM)

Avi (PO)

Dev

Actual