From 25433eaf6783f0278e93499a25cf85a125cc59b9 Mon Sep 17 00:00:00 2001 From: Agent Date: Wed, 8 Apr 2026 19:30:25 +0000 Subject: [PATCH] fix: fix: architect should resume session when processing answers on an accepted sprint PR (#436) When the architect processes human answers to design questions (answer_parsing step), it now resumes the session from the research/questions run instead of starting fresh. This preserves Claude's deep codebase understanding from the research phase, ensuring sub-issues include specific file references and implementation details. Changes: - architect-run.sh: Added detect_questions_phase() to check if PR is in questions phase (has `## Design forks` section and question comments). If so, resume the session from SID_FILE to preserve context. - formulas/run-architect.toml: Documented session resumption behavior in answer_parsing step. Session is only preserved when PR is in questions-awaiting-answers phase. Fresh sessions are started for new pitches (no stale context from old sprints). --- architect/architect-run.sh | 67 ++++++++++++++++++++++++++++++++++++- formulas/run-architect.toml | 11 ++++++ 2 files changed, 77 insertions(+), 1 deletion(-) diff --git a/architect/architect-run.sh b/architect/architect-run.sh index 0edeb70..7691bf1 100755 --- a/architect/architect-run.sh +++ b/architect/architect-run.sh @@ -119,10 +119,75 @@ PROMPT=$(build_architect_prompt) # ── Create worktree ────────────────────────────────────────────────────── formula_worktree_setup "$WORKTREE" +# ── Detect if PR is in questions-awaiting-answers phase ────────────────── +# A PR is in the questions phase if it has a `## Design forks` section and +# question comments. We check this to decide whether to resume the session +# from the research/questions run (preserves codebase context for answer parsing). +detect_questions_phase() { + local pr_number="" + local pr_body="" + + # Get open architect PRs on ops repo + local ops_repo="${OPS_REPO_ROOT:-/home/agent/data/ops}" + if [ ! -d "${ops_repo}/.git" ]; then + return 1 + fi + + # Use Forgejo API to find open architect PRs + local response + response=$(curl -sf -H "Authorization: token ${FORGE_TOKEN}" \ + "${FORGE_API}/repos/${FORGE_OPS_REPO}/pulls?state=open" 2>/dev/null) || return 1 + + # Check each open PR for architect markers + pr_number=$(printf '%s' "$response" | jq -r '.[] | select(.title | contains("architect:")) | .number' 2>/dev/null | head -1) || return 1 + + if [ -z "$pr_number" ]; then + return 1 + fi + + # Fetch PR body + pr_body=$(curl -sf -H "Authorization: token ${FORGE_TOKEN}" \ + "${FORGE_API}/repos/${FORGE_OPS_REPO}/pulls/${pr_number}" 2>/dev/null | jq -r '.body // empty') || return 1 + + # Check for `## Design forks` section (added by #101 after ACCEPT) + if ! printf '%s' "$pr_body" | grep -q "## Design forks"; then + return 1 + fi + + # Check for question comments (Q1:, Q2:, etc.) + # Use jq to extract body text before grepping (handles JSON escaping properly) + local comments + comments=$(curl -sf -H "Authorization: token ${FORGE_TOKEN}" \ + "${FORGE_API}/repos/${FORGE_OPS_REPO}/issues/${pr_number}/comments" 2>/dev/null) || return 1 + + if ! printf '%s' "$comments" | jq -r '.[].body // empty' | grep -qE 'Q[0-9]+:'; then + return 1 + fi + + # PR is in questions phase + log "Detected PR #${pr_number} in questions-awaiting-answers phase" + return 0 +} + # ── Run agent ───────────────────────────────────────────────────────────── export CLAUDE_MODEL="sonnet" -agent_run --worktree "$WORKTREE" "$PROMPT" +# Determine whether to resume session: +# - If answers detected (PR in questions phase), resume prior session to preserve +# codebase context from research/questions run +# - Otherwise, start fresh (new pitch or PR not in questions phase) +RESUME_ARGS=() +if detect_questions_phase && [ -f "$SID_FILE" ]; then + RESUME_SESSION=$(cat "$SID_FILE") + RESUME_ARGS=(--resume "$RESUME_SESSION") + log "Resuming session from questions phase run: ${RESUME_SESSION:0:12}..." +elif ! detect_questions_phase; then + log "PR not in questions phase — starting fresh session" +elif [ ! -f "$SID_FILE" ]; then + log "No session ID found for questions phase — starting fresh session" +fi + +agent_run "${RESUME_ARGS[@]}" --worktree "$WORKTREE" "$PROMPT" log "agent_run complete" rm -f "$SCRATCH_FILE" diff --git a/formulas/run-architect.toml b/formulas/run-architect.toml index 71f0f52..ee4f951 100644 --- a/formulas/run-architect.toml +++ b/formulas/run-architect.toml @@ -244,6 +244,17 @@ title = "Answer parsing + sub-issue filing (issue #102)" description = """ This step processes human answers to design questions and files sub-issues. +## Session resumption + +When processing answers, the architect resumes the session from the research/questions +run (step 2) to preserve codebase context. This ensures Claude has full understanding +of dispatcher.sh, vault.sh, branch-protection.sh, and all formulas when filing +sub-issues, resulting in more specific file references and implementation details. + +The session ID is persisted to `$SID_FILE` after the research/questions run. On +answer_parsing runs, if the PR is in the questions phase, the session is resumed +instead of starting fresh. + ## Preflight: Detect PRs in question phase An architect PR is in the question phase if ALL of the following are true: