Skip to content

Conversation

@casiusss
Copy link
Contributor

@casiusss casiusss commented Jan 2, 2026

Summary

This PR fixes several edge cases when resuming features that are stuck in pipeline steps, improving the robustness of the pipeline resume functionality.

Changes

  • Added detection logic to identify if a feature is stuck in a pipeline step during resume
  • Added dedicated resumePipelineFeature() method for pipeline-specific resume logic
  • Added detectPipelineStatus() to extract and validate pipeline step information
  • Added resumeFromPipelineStep() to resume from a specific pipeline step index
  • Updated board view to check context availability for features with pipeline status

Edge Cases Handled

  1. No context file: Restart entire pipeline from the beginning
  2. Step no longer exists in config: Complete feature without remaining pipeline steps
  3. Valid step exists: Resume execution from the crashed step and continue through remaining steps

Test Plan

  • Test resuming a pipeline feature with valid context
  • Test resuming a pipeline feature without context file
  • Test resuming a pipeline feature where step was deleted from config
  • Verify board view correctly detects context for pipeline features

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Added resume capability for features interrupted during pipeline execution
    • Added verify action within feature workflow pipelines
  • Improvements

    • Expanded action button availability for features in active pipeline states
    • Enhanced feature status detection for pipeline workflows

✏️ Tip: You can customize this high-level summary in your review settings.

This commit fixes several edge cases when resuming features stuck in pipeline steps:

- Detect if feature is stuck in a pipeline step during resume
- Handle case where context file is missing (restart from beginning)
- Handle case where pipeline step no longer exists in config
- Add dedicated resumePipelineFeature() method for pipeline-specific resume logic
- Add detectPipelineStatus() to extract and validate pipeline step information
- Add resumeFromPipelineStep() to resume from a specific pipeline step index
- Update board view to check context availability for features with pipeline status

Edge cases handled:
1. No context file → restart entire pipeline from beginning
2. Step no longer exists in config → complete feature without pipeline
3. Valid step exists → resume from the crashed step

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
@coderabbitai
Copy link

coderabbitai bot commented Jan 2, 2026

📝 Walkthrough

Walkthrough

This PR introduces pipeline-awareness to auto-mode feature resumption. The server detects when features are part of pipelines, determines the current step, and handles resuming from specific pipeline steps with edge-case handling. The UI expands status checks to include pipeline_* statuses and adds a new Verify button pathway.

Changes

Cohort / File(s) Summary
Server-side pipeline resume logic
apps/server/src/services/auto-mode-service.ts
Added internal PipelineStatusInfo interface and three private methods: detectPipelineStatus (determines if feature is in pipeline and loads config), resumePipelineFeature (handles resuming crashed pipeline features), and resumeFromPipelineStep (resumes from specific step index). Integrated pipeline-status checks into resumeFeature flow to route to pipeline-resume logic when applicable. Handles edge cases: missing context, deleted/invalid steps, and valid step recovery.
UI component status rendering
apps/ui/src/components/views/board-view/components/kanban-card/card-actions.tsx
Broadened status gating from feature.status === 'in_progress' to include any status starting with 'pipeline_'. Added support for onVerify pathway alongside existing onManualVerify and onResume options. New Verify button renders conditionally when onVerify is provided.
UI hook pipeline status awareness
apps/ui/src/components/views/board-view/hooks/use-board-effects.ts
Expanded context checks to include any status starting with 'pipeline_' alongside existing 'in_progress', 'waiting_approval', and 'verified' statuses.

Sequence Diagram

sequenceDiagram
    participant AutoModeService
    participant ProjectContext
    participant Pipeline
    participant StepExecutor

    AutoModeService->>AutoModeService: resumeFeature(projectPath, feature)
    AutoModeService->>AutoModeService: detectPipelineStatus(projectPath, featureId, currentStatus)
    AutoModeService->>ProjectContext: Load feature pipeline status
    ProjectContext-->>AutoModeService: PipelineStatusInfo {stepId, stepIndex, config}
    
    alt Feature in Pipeline
        AutoModeService->>AutoModeService: resumePipelineFeature(projectPath, feature)
        AutoModeService->>AutoModeService: resumeFromPipelineStep(projectPath, feature, startFromStepIndex, pipelineConfig)
        AutoModeService->>StepExecutor: Execute pending steps from current step
        StepExecutor-->>AutoModeService: Step completion/progress events
        AutoModeService->>ProjectContext: Update feature status
    else Feature Not in Pipeline
        AutoModeService->>AutoModeService: resumeFeature(original path)
    end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Poem

🐰 A pipeline so grand, with steps all in line,
Resume from the crash, and the features will shine!
From step to step hopping, no loss of the way,
The queue runs much smoother, hooray, hooray, hooray!

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main objective: handling edge cases in pipeline resume and improving robustness, which aligns directly with the PR's primary changes to auto-mode-service.ts and related pipeline-resume logic.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@gemini-code-assist
Copy link
Contributor

Summary of Changes

Hello @casiusss, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request significantly enhances the robustness and reliability of the pipeline resume functionality by addressing several critical edge cases. It introduces new methods to intelligently detect and handle features that get stuck during pipeline execution, ensuring that the system can recover gracefully from various failure scenarios, such as missing context files or deleted pipeline steps. The changes also extend to the UI, allowing the board view to correctly reflect the status of pipeline features.

Highlights

  • Enhanced Pipeline Resume Logic: The core resume functionality has been updated to intelligently detect if a feature is stuck within a pipeline step, diverging from the standard resume flow for non-pipeline features.
  • Dedicated Pipeline Resume Method: A new resumePipelineFeature() method has been introduced to specifically manage the complex logic required for resuming features that are part of a pipeline, addressing various edge cases.
  • Robust Pipeline Status Detection: A detectPipelineStatus() method was added to accurately identify if a feature is in a pipeline state and to extract and validate its current step information, including handling invalid or missing pipeline configurations.
  • Granular Pipeline Step Resumption: The new resumeFromPipelineStep() method allows for resuming pipeline execution from a specific step index, re-executing the crashed step and continuing through subsequent steps.
  • Improved Board View Context Detection: The board view now correctly identifies and checks for context availability for features that have a pipeline_ status, ensuring proper display and interaction for pipeline-driven features.
  • Edge Case Handling for Resumption: The pull request specifically addresses three critical edge cases during pipeline resumption: restarting the entire pipeline if no context file is found, completing the feature if a pipeline step no longer exists in the configuration, and resuming from the exact crashed step if it's valid and context is present.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request significantly improves the robustness of resuming features that are stuck in pipeline steps by handling several important edge cases. The introduction of dedicated methods like resumePipelineFeature, detectPipelineStatus, and resumeFromPipelineStep makes the logic clearer and more maintainable. The changes are well-structured and address a critical part of the workflow. My review includes a few suggestions to further enhance efficiency and maintainability by reducing redundant operations and clarifying some of the new logic.

casiusss and others added 8 commits January 2, 2026 12:42
Reduce redundant file reads by loading the feature object once and passing
it down the call chain instead of reloading it multiple times.

Changes:
- Pass feature object to resumePipelineFeature() instead of featureId
- Pass feature object to resumeFromPipelineStep() instead of featureId
- Remove redundant loadFeature() calls from these methods
- Add FeatureStatusWithPipeline import for type safety

This improves performance by eliminating unnecessary file I/O operations
and makes the data flow clearer.

Co-authored-by: gemini-code-assist bot

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Remove confusing and unnecessary delete calls from resumeFeature() and
resumePipelineFeature() methods. These were leftovers from a previous
implementation where temporary entries were added to runningFeatures.

The resumeFeature() method already ensures the feature is not running
at the start (via has() check that throws if already running), so these
delete calls serve no purpose and only add confusion about state management.

Removed delete calls from:
- resumeFeature() non-pipeline flow (line 748)
- resumePipelineFeature() no-context case (line 798)
- resumePipelineFeature() step-not-found case (line 822)

Co-authored-by: gemini-code-assist bot

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
…cation

Define a dedicated PipelineStatusInfo interface and use it consistently in both
resumePipelineFeature() parameter and detectPipelineStatus() return type.

This eliminates duplicate inline type definitions and improves maintainability
by ensuring both locations always stay in sync. Any future changes to the
pipeline status structure only need to be made in one place.

Changes:
- Add PipelineStatusInfo interface definition
- Replace inline type in resumePipelineFeature() with PipelineStatusInfo
- Replace inline return type in detectPipelineStatus() with PipelineStatusInfo

Co-authored-by: gemini-code-assist bot

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Remove unnecessary call to pipelineService.getStep() which was causing
a redundant file read of pipeline.json. The config is already loaded at
line 2807, so we can find the step directly from the in-memory config.

Changes:
- Sort config.steps first
- Find stepIndex using findIndex()
- Get step directly from sortedSteps[stepIndex] instead of calling getStep()
- Simplify null check to only check !step instead of stepIndex === -1 || !step

This optimization reduces file I/O operations and improves performance when
resuming pipeline features.

Co-authored-by: gemini-code-assist bot

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Enable the Resume button to appear for features with pipeline status
(e.g., 'pipeline_step_xyz') in addition to 'in_progress' status.

Previously, features that crashed during pipeline execution would show
a 'testing' status badge but no Resume button, making it impossible to
resume them from the UI.

Changes:
- Update card-actions.tsx condition to include pipeline_ status check
- Resume button now shows for both in_progress and pipeline_step_* statuses
- Maintains all existing behavior for other feature states

This fixes the UX issue where users could see a feature was stuck in a
pipeline step but had no way to resume it.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Resolved conflict in card-actions.tsx by:
- Keeping pipeline_status check from our branch (supports pipeline_step_* statuses)
- Adopting simplified Resume button logic from main (removed hasContext check and onVerify fallback)

The Resume button now appears for features with:
- status === 'in_progress'
- status.startsWith('pipeline_')

This combines our pipeline support fix with main's simplified button rendering logic.
Re-add the onVerify fallback for in_progress/pipeline features without context,
but fix the misleading UX issue where the button said 'Resume' but executed
verification (tests/build).

Changes:
- Restore onVerify fallback as 3rd option after skipTests Verify and Resume
- Change button label from 'Resume' to 'Verify' (honest!)
- Change icon from PlayCircle to CheckCircle2 (matches action)
- Keep same green styling for consistency

This makes sense because if a feature is in_progress but has no context,
it likely completed execution but the context was deleted. User should be
able to verify it (run tests/build) rather than having no action available.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Auto-format all files to fix format-check CI failure.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
@casiusss casiusss marked this pull request as ready for review January 2, 2026 13:17
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (2)
apps/ui/src/components/views/board-view/components/kanban-card/card-actions.tsx (1)

112-114: LGTM with minor note.

The expanded status check correctly enables action buttons for both in_progress and pipeline_* statuses. The typeof feature.status === 'string' guard is defensive but likely redundant if the Feature type guarantees status is always a string.

🔎 Optional: Simplify the condition if status is guaranteed to be a string
       {!isCurrentAutoTask &&
-        (feature.status === 'in_progress' ||
-          (typeof feature.status === 'string' && feature.status.startsWith('pipeline_'))) && (
+        (feature.status === 'in_progress' || feature.status.startsWith('pipeline_')) && (
apps/server/src/services/auto-mode-service.ts (1)

1051-1062: Consider calling recordSuccess() on successful pipeline resume.

The executeFeature method calls recordSuccess() at line 608 to reset consecutive failure tracking after successful completion. This method doesn't call it, which means successful pipeline resumes won't reset the failure counter.

🔎 Add recordSuccess() call for consistency
       // Determine final status
       const finalStatus = feature.skipTests ? 'waiting_approval' : 'verified';
       await this.updateFeatureStatus(projectPath, featureId, finalStatus);

+      // Record success to reset consecutive failure tracking
+      this.recordSuccess();
+
       console.log('[AutoMode] Pipeline resume completed successfully');
📜 Review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 2bbc811 and 472342c.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (4)
  • apps/server/src/services/auto-mode-service.ts
  • apps/ui/src/components/views/board-view/components/kanban-card/card-actions.tsx
  • apps/ui/src/components/views/board-view/hooks/use-board-effects.ts
  • scripts/lint-lockfile.mjs
🧰 Additional context used
📓 Path-based instructions (3)
**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (CLAUDE.md)

Always import from shared packages (@automaker/*), never from old relative paths

Files:

  • apps/ui/src/components/views/board-view/hooks/use-board-effects.ts
  • apps/server/src/services/auto-mode-service.ts
  • apps/ui/src/components/views/board-view/components/kanban-card/card-actions.tsx
**/*.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

Use resolveModelString() from @automaker/model-resolver to convert model aliases (haiku, sonnet, opus) to full model names

Files:

  • apps/ui/src/components/views/board-view/hooks/use-board-effects.ts
  • apps/server/src/services/auto-mode-service.ts
  • apps/ui/src/components/views/board-view/components/kanban-card/card-actions.tsx
apps/server/src/**/*.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

Use createEventEmitter() from lib/events.ts for all server operations to emit events that stream to frontend via WebSocket

Files:

  • apps/server/src/services/auto-mode-service.ts
🧠 Learnings (2)
📚 Learning: 2025-12-28T05:07:48.147Z
Learnt from: CR
Repo: AutoMaker-Org/automaker PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-12-28T05:07:48.147Z
Learning: Each feature executes in an isolated git worktree created via automaker/git-utils to protect the main branch during AI agent execution

Applied to files:

  • apps/server/src/services/auto-mode-service.ts
📚 Learning: 2025-12-30T01:02:07.114Z
Learnt from: illia1f
Repo: AutoMaker-Org/automaker PR: 324
File: apps/ui/src/components/views/board-view/components/kanban-card/kanban-card.tsx:122-131
Timestamp: 2025-12-30T01:02:07.114Z
Learning: Tailwind CSS v4 uses postfix syntax for the important modifier: append ! at the end of the utility class (e.g., backdrop-blur-[0px]! or hover:bg-red-500!). The older v3 style used a prefix (!) at the start (e.g., !backdrop-blur-[0px]); prefer the postfix form for consistency across TSX files.

Applied to files:

  • apps/ui/src/components/views/board-view/components/kanban-card/card-actions.tsx
🧬 Code graph analysis (1)
apps/ui/src/components/views/board-view/components/kanban-card/card-actions.tsx (1)
apps/ui/src/components/ui/button.tsx (1)
  • Button (108-108)
🔇 Additional comments (8)
scripts/lint-lockfile.mjs (1)

15-23: LGTM!

Formatting-only changes (blank line additions) with no functional impact.

apps/ui/src/components/views/board-view/components/kanban-card/card-actions.tsx (1)

133-193: Button priority chain looks correct.

The ternary chain properly prioritizes:

  1. Manual Verify (when skipTests + onManualVerify)
  2. Resume (when context exists via onResume)
  3. Verify fallback (when no context, via onVerify)

This aligns with the PR objective of handling missing context files gracefully.

apps/server/src/services/auto-mode-service.ts (5)

77-87: Well-structured interface.

The PipelineStatusInfo interface properly centralizes the pipeline status type, addressing the previous review feedback about inline type duplication.


828-844: Good refactor - single feature load.

The feature is loaded once at line 829 and passed to resumePipelineFeature, addressing the previous review feedback about redundant file reads.


875-944: Edge cases handled well.

The three scenarios are correctly addressed:

  1. No context (lines 898-908): Restarts pipeline from beginning via executeFeature
  2. Missing step (lines 910-929): Completes feature gracefully when pipeline config changed
  3. Valid step (lines 931-943): Resumes from crashed step

The defensive check at lines 933-935 correctly guards against an impossible state.


2890-2980: Clean implementation addressing past feedback.

The method efficiently:

  1. Delegates status parsing to pipelineService (lines 2900, 2914)
  2. Loads pipeline.json once and reuses for step lookup (lines 2931, 2949-2951)
  3. Handles all edge cases with appropriate warnings

This addresses the previous review comment about redundant pipeline.json reads.


13-19: LGTM!

Imports correctly use the shared @automaker/types package as per coding guidelines.

apps/ui/src/components/views/board-view/hooks/use-board-effects.ts (1)

131-137: Consistent with pipeline status handling.

The expanded filter correctly includes pipeline_* statuses for context checking, ensuring the board view can determine whether to show Resume or Verify buttons for features stuck in pipeline steps.

This aligns with the changes in card-actions.tsx and the server-side pipeline detection logic.

@casiusss
Copy link
Contributor Author

casiusss commented Jan 2, 2026

@coderabbitai generate docstrings

@coderabbitai
Copy link

coderabbitai bot commented Jan 2, 2026

✅ Actions performed

Initiated docstring generation; will generate only if new commits exist.

@coderabbitai
Copy link

coderabbitai bot commented Jan 2, 2026

Note

Docstrings generation - SUCCESS
Generated docstrings for this pull request at #345

coderabbitai bot added a commit that referenced this pull request Jan 2, 2026
Docstrings generation was requested by @casiusss.

* #344 (comment)

The following files were modified:

* `apps/ui/src/components/views/board-view/components/kanban-card/card-actions.tsx`
* `apps/ui/src/components/views/board-view/hooks/use-board-effects.ts`
Add detailed JSDoc documentation to meet 80% docstring coverage requirement:

- PipelineStatusInfo interface: Document all properties with types and descriptions
- resumePipelineFeature(): Document edge case handling and parameters
- resumeFromPipelineStep(): Document complete pipeline resume workflow
- detectPipelineStatus(): Document pipeline status detection scenarios

Each docstring includes:
- Clear method purpose and behavior
- All parameters with types and descriptions
- Return value documentation
- Error conditions and exceptions
- @Private tags for internal methods

This improves code maintainability and helps developers understand the
complex pipeline resume logic.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
@webdevcody webdevcody changed the base branch from main to v0.11.0rc January 13, 2026 04:48
@webdevcody
Copy link
Collaborator

@coderabbitai review

@coderabbitai
Copy link

coderabbitai bot commented Jan 13, 2026

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In @apps/server/src/services/auto-mode-service.ts:
- Around line 1202-1221: The catch block for non-abort errors should invoke the
same auto-loop failure tracking used in executeFeature: add an awaited call to
this.trackFailureAndCheckPause with the same arguments executeFeature uses
(include projectPath and featureId and the error/errorInfo as used there), so
repeated pipeline resume failures can trigger the auto-loop pause mechanism;
place the await this.trackFailureAndCheckPause(...) call in the non-abort branch
(before or after updateFeatureStatus) and preserve the existing
updateFeatureStatus and emitAutoModeEvent behavior.
🧹 Nitpick comments (2)
apps/ui/src/components/views/board-view/components/kanban-card/card-actions.tsx (1)

1-1: Consider removing @ts-nocheck directive.

The @ts-nocheck directive disables TypeScript checking for this entire file, which can mask potential type errors. Consider addressing the underlying type issues and removing this directive to benefit from TypeScript's type safety.

apps/server/src/services/auto-mode-service.ts (1)

1006-1008: Use logger instead of console.log for consistent logging.

This file uses logger (created via createLogger) throughout, but these new methods use console.log and console.warn. This creates inconsistent log output formatting and may miss log filtering/routing configured for the logger.

♻️ Suggested fix
-    console.log(
+    logger.info(
       `[AutoMode] Resuming feature ${featureId} from pipeline step ${pipelineInfo.stepId}`
     );

Apply similar changes at lines 1024-1026, 1036-1038, 1110-1112, 1137-1141, 1194, 1213, 3211-3214, 3229-3231, 3249-3251, 3262-3264.

📜 Review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 0fa5fdd and 419abf8.

📒 Files selected for processing (3)
  • apps/server/src/services/auto-mode-service.ts
  • apps/ui/src/components/views/board-view/components/kanban-card/card-actions.tsx
  • apps/ui/src/components/views/board-view/hooks/use-board-effects.ts
🧰 Additional context used
📓 Path-based instructions (3)
**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (CLAUDE.md)

Always import from shared packages (@automaker/*), never from old relative paths

Files:

  • apps/server/src/services/auto-mode-service.ts
  • apps/ui/src/components/views/board-view/components/kanban-card/card-actions.tsx
  • apps/ui/src/components/views/board-view/hooks/use-board-effects.ts
apps/server/src/**/*.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

Use createEventEmitter() from lib/events.ts for all server operations to emit events that stream to frontend via WebSocket

Files:

  • apps/server/src/services/auto-mode-service.ts
**/*.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

Use resolveModelString() from @automaker/model-resolver to convert model aliases (haiku, sonnet, opus) to full model names

Files:

  • apps/server/src/services/auto-mode-service.ts
  • apps/ui/src/components/views/board-view/components/kanban-card/card-actions.tsx
  • apps/ui/src/components/views/board-view/hooks/use-board-effects.ts
🧠 Learnings (2)
📚 Learning: 2025-12-28T05:07:48.147Z
Learnt from: CR
Repo: AutoMaker-Org/automaker PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-12-28T05:07:48.147Z
Learning: Each feature executes in an isolated git worktree created via automaker/git-utils to protect the main branch during AI agent execution

Applied to files:

  • apps/server/src/services/auto-mode-service.ts
📚 Learning: 2025-12-30T01:02:07.114Z
Learnt from: illia1f
Repo: AutoMaker-Org/automaker PR: 324
File: apps/ui/src/components/views/board-view/components/kanban-card/kanban-card.tsx:122-131
Timestamp: 2025-12-30T01:02:07.114Z
Learning: Tailwind CSS v4 uses postfix syntax for the important modifier: append ! at the end of the utility class (e.g., backdrop-blur-[0px]! or hover:bg-red-500!). The older v3 style used a prefix (!) at the start (e.g., !backdrop-blur-[0px]); prefer the postfix form for consistency across TSX files.

Applied to files:

  • apps/ui/src/components/views/board-view/components/kanban-card/card-actions.tsx
🧬 Code graph analysis (2)
apps/server/src/services/auto-mode-service.ts (8)
libs/types/src/index.ts (4)
  • PipelineStep (208-208)
  • PipelineConfig (209-209)
  • FeatureStatusWithPipeline (211-211)
  • Feature (49-49)
libs/types/src/pipeline.ts (3)
  • PipelineStep (5-13)
  • PipelineConfig (15-18)
  • FeatureStatusWithPipeline (22-28)
apps/server/src/services/feature-loader.ts (2)
  • Feature (20-20)
  • getFeatureDir (143-145)
libs/platform/src/paths.ts (1)
  • getFeatureDir (49-51)
apps/server/src/lib/sdk-options.ts (1)
  • validateWorkingDirectory (107-119)
libs/utils/src/index.ts (1)
  • classifyError (14-14)
apps/server/src/lib/error-handler.ts (1)
  • classifyError (180-216)
apps/server/src/services/pipeline-service.ts (1)
  • pipelineService (320-320)
apps/ui/src/components/views/board-view/components/kanban-card/card-actions.tsx (1)
apps/ui/src/components/ui/button.tsx (1)
  • Button (108-108)
🔇 Additional comments (6)
apps/ui/src/components/views/board-view/hooks/use-board-effects.ts (1)

103-109: LGTM! Context check correctly extended to pipeline statuses.

The defensive typeof f.status === 'string' check before startsWith('pipeline_') is appropriate for runtime safety since the features array is typed as any[]. This aligns well with the server-side pipeline status handling introduced in this PR.

apps/ui/src/components/views/board-view/components/kanban-card/card-actions.tsx (1)

120-203: LGTM! Pipeline status handling and action button logic are correct.

The expanded status gating to include pipeline_* statuses is consistent with the server-side changes. The conditional rendering chain (Manual Verify → Resume → Verify) correctly prioritizes the actions based on feature state and available handlers.

apps/server/src/services/auto-mode-service.ts (4)

89-108: LGTM! Well-documented interface for pipeline status information.

The PipelineStatusInfo interface is well-designed with clear JSDoc documentation explaining each property's purpose and edge case values (e.g., stepIndex = -1 when step not found).


943-960: LGTM! Clean pipeline detection integration into resume flow.

The pipeline status detection is correctly integrated. The defensive || '' fallback handles potential undefined status, and the detectPipelineStatus method handles non-pipeline statuses gracefully by returning isPipeline: false.


3171-3274: LGTM! Comprehensive pipeline status detection with proper edge case handling.

The method correctly handles multiple scenarios:

  1. Non-pipeline statuses return early with isPipeline: false
  2. Invalid pipeline status format is logged and handled
  3. Missing/empty pipeline config is detected
  4. Deleted steps return stepIndex: -1 for caller to handle
  5. Valid steps return complete information

The delegation to pipelineService.isPipelineStatus() and pipelineService.getStepIdFromStatus() promotes code reuse.


19-21: LGTM! Imports correctly added for new types.

The new imports for FeatureStatusWithPipeline and PipelineConfig from @automaker/types are correctly added to support the pipeline status detection logic.

Comment on lines +1202 to +1221
} catch (error) {
const errorInfo = classifyError(error);

if (errorInfo.isAbort) {
this.emitAutoModeEvent('auto_mode_feature_complete', {
featureId,
passes: false,
message: 'Pipeline resume stopped by user',
projectPath,
});
} else {
console.error(`[AutoMode] Pipeline resume failed for feature ${featureId}:`, error);
await this.updateFeatureStatus(projectPath, featureId, 'backlog');
this.emitAutoModeEvent('auto_mode_error', {
featureId,
error: errorInfo.message,
errorType: errorInfo.type,
projectPath,
});
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Consider tracking failures for auto-loop pause behavior.

The error handling doesn't call trackFailureAndCheckPause() like executeFeature() does (see lines 746-756). This means repeated pipeline resume failures won't trigger the auto-loop pause mechanism that protects against quota exhaustion or API issues.

🐛 Suggested fix
       } else {
         console.error(`[AutoMode] Pipeline resume failed for feature ${featureId}:`, error);
         await this.updateFeatureStatus(projectPath, featureId, 'backlog');
         this.emitAutoModeEvent('auto_mode_error', {
           featureId,
           error: errorInfo.message,
           errorType: errorInfo.type,
           projectPath,
         });
+
+        // Track this failure for auto-loop pause mechanism
+        const shouldPause = this.trackFailureAndCheckPause({
+          type: errorInfo.type,
+          message: errorInfo.message,
+        });
+
+        if (shouldPause) {
+          this.signalShouldPause({
+            type: errorInfo.type,
+            message: errorInfo.message,
+          });
+        }
       }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
} catch (error) {
const errorInfo = classifyError(error);
if (errorInfo.isAbort) {
this.emitAutoModeEvent('auto_mode_feature_complete', {
featureId,
passes: false,
message: 'Pipeline resume stopped by user',
projectPath,
});
} else {
console.error(`[AutoMode] Pipeline resume failed for feature ${featureId}:`, error);
await this.updateFeatureStatus(projectPath, featureId, 'backlog');
this.emitAutoModeEvent('auto_mode_error', {
featureId,
error: errorInfo.message,
errorType: errorInfo.type,
projectPath,
});
}
} catch (error) {
const errorInfo = classifyError(error);
if (errorInfo.isAbort) {
this.emitAutoModeEvent('auto_mode_feature_complete', {
featureId,
passes: false,
message: 'Pipeline resume stopped by user',
projectPath,
});
} else {
console.error(`[AutoMode] Pipeline resume failed for feature ${featureId}:`, error);
await this.updateFeatureStatus(projectPath, featureId, 'backlog');
this.emitAutoModeEvent('auto_mode_error', {
featureId,
error: errorInfo.message,
errorType: errorInfo.type,
projectPath,
});
// Track this failure for auto-loop pause mechanism
const shouldPause = this.trackFailureAndCheckPause({
type: errorInfo.type,
message: errorInfo.message,
});
if (shouldPause) {
this.signalShouldPause({
type: errorInfo.type,
message: errorInfo.message,
});
}
}
🤖 Prompt for AI Agents
In @apps/server/src/services/auto-mode-service.ts around lines 1202 - 1221, The
catch block for non-abort errors should invoke the same auto-loop failure
tracking used in executeFeature: add an awaited call to
this.trackFailureAndCheckPause with the same arguments executeFeature uses
(include projectPath and featureId and the error/errorInfo as used there), so
repeated pipeline resume failures can trigger the auto-loop pause mechanism;
place the await this.trackFailureAndCheckPause(...) call in the non-abort branch
(before or after updateFeatureStatus) and preserve the existing
updateFeatureStatus and emitAutoModeEvent behavior.

@webdevcody webdevcody merged commit c2f5c07 into AutoMaker-Org:v0.11.0rc Jan 13, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants