Skip to content

22 — Project Management & Zoho Integration

Version: 1.0
Date: 2026-03-21
Tech Lead: Rui Rosa
Scope: Task lifecycle, status workflow, Claude ↔ Zoho ↔ Azure DevOps integration, best practices


This project uses Zoho Projects as the single source of truth for project management. Development work is performed 99% by Claude Code (AI agent), which creates branches, implements features, opens PRs, and deploys — all autonomously.

This creates a unique requirement: the project management system must be optimized for AI-driven development where human intervention is limited to prioritization, review, and validation.

Environments

Development

Project Management

Task assigned

(status: To Do)

Status updates

+ comments

Branch + commits

+ PR creation

CI/CD pipeline

QA validation

Release

PR link in

Zoho comment

Zoho Projects

Claude Code

Git / Azure DevOps

DEV Environment

STAGE / QA

Production

PrincipleDescription
Single source of truthEvery development action is reflected in Zoho — no work exists only in Git
AI-first statusesStatuses optimized for Claude’s workflow, not a traditional human team
Human gatesHumans only act at review, validation, and prioritization gates
Bidirectional traceabilityEvery PR links to a Zoho task; every Zoho task links to its PR
Comment-driven progressDetailed progress lives in comments; statuses show pipeline position

ItemValue
Portalwygroup
ProjectSavoy Signature Hotels (P894)
Task key formatP894-T{XXX}
Task URL patternhttps://projects.zoho.com/portal/wygroup#zp/task-detail/{taskSystemId}

Other

BACKLOG

PREPARAÇÃO DE BACKOFFICE + GO LIVE

Development Sprints

DEV Sprint 0 — Setup & Infra

DEV Sprint 1 — Foundations & Heroes

DEV Sprint 2 — Core Modules

DEV Sprint 3 — Interactive Components

DEV Sprint 4 — Advanced Features

DEV Sprint QA — Tests & Validation

Design

FEEDBACK PROPOSTA

FASE TÁTICA

FASE OPERACIONAL - DESIGN

Management

GERAL

GESTÃO

CERIMÓNIAS

FATURAÇÃO

TasklistIDPurpose
DEV Sprint 0 — Setup & Infra1990636000017517013Monorepo, Azure, Cloudflare, pipelines, CMS setup
DEV Sprint 1 — Foundations & Heroes1990636000017519011Header, Footer, Main Menu, Heroes, Breadcrumbs, Error Page
DEV Sprint 2 — Core Modules1990636000017518059Item Cards, Quotes, Highlight, Banner, Slider, Text Image, RTE, Full Image, Icon List, Decorative Type
DEV Sprint 3 — Interactive Components1990636000017520071Slider Categories, Slider, FAQs, Image Gallery, Logo Carousel, Cross-Content Cards
DEV Sprint 4 — Advanced Features1990636000017520075Booking Bar, Form, Modal, Social Media, Social Share, Newsletter
DEV Sprint QA — Tests & Validation1990636000017516055Cross-module testing, E2E, visual regression, performance
BACKLOG1990636000010437441Future work, not yet scoped or estimated
Work typeNaming patternExample
Module developmentM{XX} {Name} — DevelopmentM27 Text Image — Development
InfrastructureINFRA — {Description}INFRA — Setup Storybook 10 Environment
Bug fixFIX — {Module/Area}: {Description}FIX — M11 Banner: mobile overflow
FeatureFEAT — {Description}FEAT — Auth Gate for DEV environments
SecuritySEC — {Description}SEC — Security Pipeline & Pentesting
ChoreCHORE — {Description}CHORE — Upgrade pnpm to 9.x

#StatusProblem
11. BacklogOK — kept
22. To DoOK — kept
55. Work in progressToo broad — covers everything from “just started” to “almost done”
66. Code ReviewConflates PR review, design review, and QA into one status
77. DoneNo separation between QA acceptance and final sign-off
9999. DroppedOK — kept

The workflow uses the Ready/Doing split pattern from Kanban for each human gate. This makes queue time (waiting) vs active time (working) measurable per team.

Task created

Prioritized for sprint

Claude starts work

Claude needs human decision

Human provides input

PR created

Tech Lead picks up

Code approved

Changes requested

Design team picks up

Design approved

Design issues found

QA/PM picks up

QA passes

Issues found

PO/Tech Lead closes

Cancelled

Cancelled

1. Backlog
2. To Do
3. In Development
4. Awaiting Input
5. Dev — Ready for Review
6. Dev — In Review
7. Design — Ready for Review
8. Design — In Review
9. QA — Ready for Acceptance
10. QA — In Acceptance
11. QA — Accepted
12. Done
99. Dropped
#StatusWho ActsTypeEntry TriggerExit Trigger
11. BacklogNobodyTask createdPrioritized into sprint
22. To DoNobodyQueueSprint planningClaude picks it up
33. In DevelopmentClaudeActiveBranch created, work beginsPR created OR needs input
44. Awaiting InputHumanActiveClaude blocked on decision/Figma/infoHuman responds → back to 3
55. Dev — Ready for ReviewNobodyQueue → RuiPR createdTech Lead picks up review
66. Dev — In ReviewTech LeadActiveTech Lead starts reviewCode approved OR changes requested
77. Design — Ready for ReviewNobodyQueue → DesignCode review approvedDesign team picks up
88. Design — In ReviewDesign TeamActiveDesign team starts reviewDesign approved OR issues found
99. QA — Ready for AcceptanceNobodyQueue → QA/PMDesign approved, deployed to DEVQA/PM picks up testing
1010. QA — In AcceptanceQA/PMActiveQA/PM starts testing on DEVQA passes OR issues found
1111. QA — AcceptedNobodyQueue → PO/TLQA team validatesPO or Tech Lead closes
1212. DonePO/Tech Lead final sign-off
9999. DroppedDecision to cancel

3.4 Queue vs Active — Team Responsibility

Section titled “3.4 Queue vs Active — Team Responsibility”

PO / Tech Lead

QA / PM

Design Team

Dev / Tech Lead

Claude (AI)

changes requested

design issues

bugs found

3. In Development

(active)

4. Awaiting Input

(blocked)

5. Dev — Ready

(queue)

6. Dev — In Review

(active)

7. Design — Ready

(queue)

8. Design — In Review

(active)

9. QA — Ready

(queue)

10. QA — In Acceptance

(active)

11. QA — Accepted

(queue)

12. Done

Key insight: Queue columns (light colors) measure wait time. Active columns (dark colors) measure work time. If queue columns accumulate tasks, that team is the bottleneck.

3.5 AI Development Sub-Phases (Tags + Progress)

Section titled “3.5 AI Development Sub-Phases (Tags + Progress)”

While Claude is in 3. In Development, internal progress is tracked via tags and percent_complete — not additional statuses. This keeps the board clean while providing visibility into Claude’s current phase.

TagPhaseDescription
ai:storybookPhase ATypes, stories, test scaffolding
ai:reactPhase BComponent, mapper, SCSS, unit tests
ai:visual-testingPhase B7Pixel Perfect validation against Figma
ai:umbracoPhase CElement Type migration, CMS integration
ai:pre-prPre-PRSelf-review — lint, typecheck, all tests green

Claude updates the tag when transitioning between phases. If a session ends mid-phase, the next session reads the tag to know where to resume.

Note: If the Zoho MCP server does not support tag management via API, Claude tracks sub-phases via percent_complete + structured comments. The tags serve as a visual reference in the Zoho backoffice (managed manually or via future API support).

percent_completePhaseWhat it means
0%Not startedTask picked up, branch not yet created
10%Phase A startScaffold + types created
20%Phase A doneStories + test file complete
30%Phase B startComponent implementation started
50%Phase B doneComponent + mapper + tests passing
60%Phase B7 startVisual testing started
70%Phase B7 doneBoth desktop (≤5%) and mobile (≤10%) pass
80%Phase C startUmbraco migration started
90%Phase C doneElement Type created, Block List registered, content tested
95%Pre-PRSelf-review — lint, typecheck, tests, visual regression
100%PR createdStatus transitions to 5. Dev — Ready for Review

Claude updates percent_complete via zoho_update_task at each phase transition, accompanied by a structured comment.

<b>Phase Update — {Phase Name}</b>
<br>
<b>Task:</b> {taskName}
<b>Phase:</b> {previous} → {current}
<b>Progress:</b> {percent}%
<b>Date:</b> {date}
<br>
<b>Completed:</b>
- {what was done in previous phase}
<br>
<b>Next:</b>
- {what will be done in current phase}

Status names passed to zoho_update_task MUST be exact strings — the API silently ignores invalid names.

#Valid (exact string)Common mistakes (WILL FAIL SILENTLY)
11. BacklogBacklog, backlog
22. To DoTo Do, TODO, To do
33. In DevelopmentIn Development, Development, Dev
44. Awaiting InputAwaiting Input, Blocked, Waiting
55. Dev — Ready for ReviewDev Ready, Ready for Review, Dev - Ready
66. Dev — In ReviewDev In Review, In Review, Code Review
77. Design — Ready for ReviewDesign Ready, Ready for Design
88. Design — In ReviewDesign Review, In Design Review
99. QA — Ready for AcceptanceQA Ready, Ready for QA
1010. QA — In AcceptanceQA In Acceptance, In QA
1111. QA — AcceptedQA Accepted, Accepted
1212. DoneDone, Completed, Complete
9999. DroppedDropped, Cancelled

Rule: Always copy status names from this table. Never type from memory. The dash is an em-dash (—), not a hyphen (-).


DEV EnvironmentQA / PMDesign TeamGit / Azure DevOpsZoho ProjectsClaude CodeHuman (User)DEV EnvironmentQA / PMDesign TeamGit / Azure DevOpsZoho ProjectsClaude CodeHuman (User)Phase 0 — Task Identificationalt[Claude creates][User provides]alt[Task found][Task NOT found]Phase 1 — Development (Claude)opt[Claude needs human input]loop[Phases A → B → B7 → C]Phase 2 — Dev Review (Tech Lead)alt[Changes requested][Approved]Phase 3 — Design Reviewalt[Design issues][Approved]Phase 4 — QA Acceptancealt[Issues found][Validated]Phase 5 — Final Sign-off & Cleanup"Implement M27 Text Image"zoho_search_tasks("M27 Text Image")P894-T431 foundStore task_id for sessionNo task found. Options:1. I create it2. You provide the linkzoho_create_task(name, tasklist, description, type)New task P894-T{XXX} createdHere's the task: P894-T431zoho_get_task(task_id)Create branch + worktreestatus → "3. In Development" + tag ai:storybookcomment: "Development Started"Implement phaseUpdate percent_complete + tagcomment: "Phase Update"status → "4. Awaiting Input"I need your decision on {X}Here's my answerstatus → "3. In Development"Push commits, create PRstatus → "5. Dev — Ready for Review"comment: "PR CreatedReview codestatus → "6. Dev — In Review"Fix these issuesstatus → "3. In Development"Approve + merge PRstatus → "7. Design — Ready for Review"comment: "Code approved, ready for Design"comment: "Design Review Handoff" (detailed)status → "8. Design — In Review"Test Storybook + DEV sitecomment with issuesstatus → "3. In Development"Fix issues, loop backstatus → "9. QA — Ready for Acceptance"comment: "Design approved"status → "10. QA — In Acceptance"Test on DEV environmentcomment with bugsstatus → "3. In Development"Fix bugs, loop backstatus → "11. QA — Accepted"comment: "QA passed"status → "12. Done"Remove worktree + delete branchcomment: "Task complete, branch cleaned up"

Found

Not found

Claude creates

User provides

Need human input

Human responds

All phases done

PR created

Changes requested

Approved

Issues found

Approved

Bugs found

Validated

Task assigned to Claude

Search Zoho

for task

Store task_id

Ask user

Create task in Zoho

Fetch task details

3. In Development

+ tag ai:storybook

+ comment: Dev Started

Claude working...

tags + percent_complete

4. Awaiting Input

+ comment: Need input

5. Dev — Ready for Review

+ comment: PR Created

Tech Lead picks up

6. Dev — In Review

7. Design — Ready for Review

+ comment: Design Handoff

Design picks up

8. Design — In Review

9. QA — Ready for Acceptance

+ deploy to DEV

QA/PM picks up

10. QA — In Acceptance

11. QA — Accepted

12. Done

(PO/Tech Lead closes)

Not all transitions are done by Claude. This table clarifies ownership:

FromToWho transitionsHow
2. To Do3. In DevelopmentClaudeAutomatic when work starts
3. In Development4. Awaiting InputClaudeWhen blocked on human input
4. Awaiting Input3. In DevelopmentClaudeWhen input received
3. In Development5. Dev — Ready for ReviewClaudeWhen PR is created
5. Dev — Ready for Review6. Dev — In ReviewTech LeadWhen starts reviewing
6. Dev — In Review7. Design — Ready for ReviewTech LeadWhen code approved
6. Dev — In Review3. In DevelopmentTech LeadWhen changes requested
7. Design — Ready for Review8. Design — In ReviewDesign TeamWhen starts reviewing
8. Design — In Review9. QA — Ready for AcceptanceDesign TeamWhen design approved
8. Design — In Review3. In DevelopmentDesign TeamWhen issues found
9. QA — Ready for Acceptance10. QA — In AcceptanceQA/PMWhen starts testing
10. QA — In Acceptance11. QA — AcceptedQA/PMWhen QA passes
10. QA — In Acceptance3. In DevelopmentQA/PMWhen bugs found
11. QA — Accepted12. DonePO / Tech LeadFinal sign-off

Rule: Claude only transitions statuses 2→3, 3→4, 4→3, and 3→5. All other transitions are human-driven. Claude may post comments at any stage but must not change statuses owned by other teams.


5. Zoho ↔ Git ↔ Azure DevOps Integration

Section titled “5. Zoho ↔ Git ↔ Azure DevOps Integration”

Every piece of work must have a complete traceability chain linking all platforms:

DEV

Azure DevOps

Git

Zoho

task key in

PR title & body

PR link in

Zoho comment

source branch

conventional commits

CI/CD

CI/CD

CI/CD

Storybook link

in Zoho comment

DEV URL

in Zoho comment

P894-T431

M27 Text Image

feat/m27-text-image

feat(m27): add types

feat(m27): implement component

feat(m27): add Umbraco migration

PR #187

feat(m27): Text Image [P894-T431]

Storybook story

Umbraco backoffice

DEV site

ElementWhereFormat
Zoho task keyPR titlefeat(m27): Text Image module [P894-T431]
Zoho task URLPR description[P894-T431 — M27 Text Image](https://projects.zoho.com/...)
PR URLZoho comment<a href="{prUrl}">#{prNumber} — {title}&lt;/a&gt;
Storybook URLZoho comment<a href="https://savoy-dev-storybook.wycreative.com/...">View in Storybook&lt;/a&gt;
DEV site URLZoho comment<a href="https://savoy-dev-signature.wycreative.com">DEV Site&lt;/a&gt;
Branch patternZoho task typeExample
feat/m{XX}-{name}Module taskfeat/m27-text-imageM27 Text Image — Development
fix/{description}Bug fix taskfix/hero-slider-mobileFIX — M05: mobile overflow
chore/{description}Infra/chore taskchore/upgrade-storybookCHORE — Upgrade Storybook 10
docs/{description}Docs taskdocs/prd-zohoDOCS — Zoho integration PRD

Claude only controls a subset of status transitions. This scope is intentionally limited — human gates belong to humans.

Claude's Other Duties

Update percent_complete at each phase

Update tags at each phase

Post structured comments at every transition

Include Zoho task key in PR title + body

Post Design Review Handoff comment

Claude's Status Transitions

2. To Do → 3. In Development

3. In Development → 4. Awaiting Input

4. Awaiting Input → 3. In Development

3. In Development → 5. Dev — Ready for Review

RuleReason
Never transition statuses 6→7, 7→8, 8→9, 9→10, 10→11, 11→12These belong to human teams (Dev, Design, QA, PO)
Never move to 12. DoneOnly PO/Tech Lead closes tasks
Never skip status transitionsStakeholders rely on the board for visibility
Never start work without a linked Zoho taskBreaks traceability
Never create a PR without Zoho task key in titleRequired for bidirectional linking
Never silently skip a failed status updateMust retry once, then notify user
Never skip the Design Review Handoff commentDesign team depends on it for context

The task_id obtained during initial lookup MUST be retained throughout the session. Context compression in long sessions can cause loss.

Mitigation strategy:

  1. After lookup, announce to user: "Zoho task: P894-T{XXX} (ID: {task_id}) — {taskName}"
  2. Before every Zoho API call, verify task_id is still in context
  3. If lost, re-fetch via zoho_search_tasks before proceeding
  4. Never skip a Zoho update because the ID was lost

0 0 0 0 0 1 1 1 1 1 2Development Started Phase A - Storybook Phase A Update Awaiting Input Phase B Update Input Received Phase B - React Phase B7 Update Phase B7 - Visual Tests Phase C Update Phase C - Umbraco PR Created Code Review Feedback Dev Review Design Review Handoff Design Review Feedback Design Review QA Feedback QA Acceptance QA Accepted Done Claude CommentsHuman CommentsClaude ActiveHuman ActiveZoho Comments Throughout Task Lifecycle

All comment templates use HTML format. Zoho renders &lt;br&gt; with extra vertical spacing — use &lt;br&gt; only between distinct sections, not at the end of every line.

<b>Development Started</b>
<br>
<b>Task:</b> {taskName}
<b>Branch:</b> {branchName}
<b>Worktree:</b> {worktreePath}
<b>Date:</b> {date}
<br>
<b>Scope:</b>
- {deliverable 1}
- {deliverable 2}
<br>
<i>Status updated to "3. In Development".</i>
<b>Awaiting Input</b>
<br>
<b>Task:</b> {taskName}
<b>Branch:</b> {branchName}
<b>Current phase:</b> {Phase A/B/B7/C}
<b>Date:</b> {date}
<br>
<b>What I need:</b>
{detailed description of what decision/information/asset is needed}
<br>
<b>Options (if applicable):</b>
1. {option A} — {pros/cons}
2. {option B} — {pros/cons}
<br>
<i>Status updated to "4. Awaiting Input". Development paused until response.</i>
<b>Development Resumed</b>
<br>
<b>Task:</b> {taskName}
<b>Blocked from:</b> {startDate} to {endDate}
<b>Resolution:</b> {what was decided/provided}
<br>
<i>Status updated to "3. In Development".</i>
<b>PR Created</b>
<br>
<b>PR:</b> <a href="{prUrl}">#{prNumber} — {prTitle}</a>
<b>Branch:</b> {branchName} → develop
<b>Author:</b> Claude Code
<b>Status:</b> Pending Dev Review
<br>
<b>Changes:</b>
- {change 1}
- {change 2}
<br>
<b>Pre-PR Checks:</b>
- [x] TypeScript clean (pnpm typecheck)
- [x] Linter clean (pnpm lint)
- [x] Unit tests pass (pnpm --filter modules test)
- [x] Visual tests pass (pnpm --filter storybook visual:test)
<br>
<i>Status updated to "5. Dev — Ready for Review".</i>
<b>PR Created — Module M{XX}</b>
<br>
<b>PR:</b> <a href="{prUrl}">#{prNumber} — {prTitle}</a>
<b>Branch:</b> {branchName} → develop
<b>Author:</b> Claude Code
<b>Status:</b> Pending Dev Review
<br>
<b>Changes:</b>
- {change 1}
- {change 2}
<br>
<b>Pre-PR Checks:</b>
- [x] TypeScript clean
- [x] Linter clean
- [x] Unit tests pass
- [x] Visual tests: desktop {X}% / mobile {Y}%
<br>
<b>Development Phases Completed:</b>
- [x] Phase A — Storybook (types, stories, test file)
- [x] Phase B — React (component, mapper, SCSS)
- [x] Phase B7 — Pixel Perfect (desktop ≤5%, mobile ≤10%)
- [x] Phase C — Umbraco (migration, Block List, content tested)
<br>
<i>Status updated to "5. Dev — Ready for Review".</i>

This is the most important comment in the workflow. The Design team may not have context on the task — this comment must be self-contained with everything they need to validate the work.

<b>Design Review Handoff — Module M{XX} {Name}</b>
<br>
<b>Task:</b> <a href="{zohoTaskUrl}">P894-T{XXX} — {taskName}</a>
<b>PR:</b> <a href="{prUrl}">#{prNumber}</a> (code approved by Tech Lead)
<b>Date:</b> {date}
<br>
<b>Figma Reference</b>
<br>
<b>Desktop:</b> <a href="{figmaDesktopUrl}">Figma Desktop ({figmaPageName})</a>
<b>Mobile:</b> <a href="{figmaMobileUrl}">Figma Mobile ({figmaPageName})</a>
<br>
<b>Where to Review</b>
<br>
<b>Storybook (isolated component):</b>
<a href="https://savoy-dev-storybook.wycreative.com/?path=/docs/modules-m{xx}---{kebab-name}--docs">Module Documentation</a>
<a href="https://savoy-dev-storybook.wycreative.com/?path=/story/modules-m{xx}---{kebab-name}--figma-fidelity">FigmaFidelity Story</a>
<br>
<b>DEV Site (in context):</b>
<a href="https://savoy-dev-signature.wycreative.com/{testPagePath}">Savoy Signature</a>
<a href="https://savoy-dev-{altSiteKey}.wycreative.com/{testPagePath}">{Alt Hotel Name}</a>
<br>
<b>Umbraco CMS:</b>
<a href="https://savoy-dev-cms.wycreative.com/umbraco">Open Backoffice</a> → {contentPath}
<br>
<b>Acceptance Criteria</b>
<br>
<b>Visual Fidelity:</b>
- [ ] Desktop layout matches Figma (spacing, alignment, typography)
- [ ] Mobile layout matches Figma (spacing, alignment, typography)
- [ ] Fluid responsive between 375px and 1440px (no jumps or clipping)
- [ ] Colors match design tokens for Savoy Palace theme
- [ ] Typography (font, size, weight, line-height) matches Figma
- [ ] Images display at correct aspect ratio and crop
<br>
<b>Interaction & Behaviour:</b>
- [ ] {interaction criterion 1 — e.g., "Hover states on CTA buttons"}
- [ ] {interaction criterion 2 — e.g., "Accordion expand/collapse animation"}
- [ ] Keyboard navigation works (Tab, Enter, Escape)
<br>
<b>Multi-Theme:</b>
- [ ] Test in Storybook theme switcher with at least 3 themes
- [ ] Colors and fonts adapt correctly per theme
<br>
<b>Content Variants:</b>
- [ ] Works with long text (no overflow or clipping)
- [ ] Works with minimal content (no broken layout)
- [ ] Works with empty optional fields (graceful fallback)
<br>
<b>Pixel Perfect Results (automated):</b>
Desktop diff: {X}% (threshold: ≤5%)
Mobile diff: {Y}% (threshold: ≤10%)
<br>
<b>Notes for Design Team:</b>
{any specific decisions made during implementation, deviations from Figma with reasoning, or areas that need special attention}
<br>
<i>Status updated to "7. Design — Ready for Review".</i>
<i>Please update to "8. Design — In Review" when you start reviewing.</i>

Rule: This comment MUST be posted by Claude when the PR is approved by the Tech Lead (transition 6→7). It is the Design team’s primary source of context. Every field must be filled — no placeholders.

<b>PR Merged</b>
<br>
<b>PR:</b> <a href="{prUrl}">#{prNumber}</a> merged to <b>develop</b>
<b>Merged by:</b> {user}
<b>Date:</b> {date}
<br>
<i>Awaiting deployment to DEV environment.</i>
<b>Deployed to DEV</b>
<br>
<b>Deploy PR:</b> <a href="{deployPrUrl}">#{deployPrNumber}</a>
<b>Date:</b> {date}
<br>
<b>Test URLs:</b>
- <a href="https://savoy-dev-signature.wycreative.com">DEV Site (Signature)</a>
- <a href="https://savoy-dev-storybook.wycreative.com">Storybook</a>
- <a href="https://savoy-dev-cms.wycreative.com/umbraco">Umbraco CMS</a>
<br>
<i>Status: "9. QA — Ready for Acceptance". Ready for testing.</i>
<b>QA Accepted</b>
<br>
<b>Task:</b> {taskName}
<b>Tested by:</b> {qaTeamMember}
<b>Date:</b> {date}
<br>
<b>Test Results:</b>
- {what was tested}
- {any notes or observations}
<br>
<i>Status updated to "11. QA — Accepted". Awaiting PO/Tech Lead sign-off for "12. Done".</i>
<b>Rollback</b>
<br>
<b>PR:</b> <a href="{prUrl}">#{prNumber}</a> reverted from <b>develop</b>
<b>Reason:</b> {why the rollback was needed}
<b>Date:</b> {date}
<br>
<b>Next steps:</b> {what needs to happen before re-merge}
<br>
<i>Status reverted to "3. In Development".</i>

Yes

No

Yes

No

Fix and retry

Update manually

Skip (with risk)

zoho_update_task()

Success?

Continue workflow

Retry once

Success?

Notify user with error

User response

Log intended status

in next comment

Rules:

  1. Retry failed zoho_update_task exactly once
  2. If retry fails, notify user immediately with error details
  3. Never silently skip a failed update
  4. If user approves skipping, log the intended status in the next comment posted to the task

Yes

No

Yes

No

Need to call Zoho API

task_id in context?

Make API call

zoho_search_tasks(task name)

Found?

Store task_id, announce to user

Ask user for task ID

Yes

No

Claude creates

User provides ID

zoho_search_tasks()

Task found?

Use existing task

Ask user

User choice

zoho_create_task()

zoho_get_task(id)

Confirm task to user

Proceed with development


When AI development outpaces design, modules are often built before Figma is finalized — or even before it exists. This creates two scenarios:

ScenarioExampleWhat’s missing
Module built against draft FigmaM27 Text Image — Figma exists but not approvedFinal visual alignment, possible layout changes
Module built without any FigmaM28 Icon List — built from PRD/spec onlyFull Figma analysis, visual alignment, pixel-perfect testing

The standard single-pass workflow (A→B→B7→C→Done) doesn’t account for this. Modules need to cycle back through specific phases when design arrives or changes.

A module can go through multiple development passes. Each pass is tracked via a tag and a structured re-entry comment.

Pass 3 — Polish (if needed)

Pass 2 — Design Revision

Pass 1 — Initial Build

Figma exists

(even draft)

No Figma

(skip B7)

Design finalized

later

Design feedback

Phase A — Storybook

Phase B — React

Phase B7 — Visual Tests

Phase C — Umbraco

PR → Dev Review

A1 — Re-analyse Figma

B — Visual alignment fixes

B7 — Pixel Perfect (final Figma)

PR → Dev → Design Review

B — Targeted CSS fixes

B7 — Re-validate

PR → Dev Review

PassTagWhen triggeredRe-entry pointPhases repeated
Pass 1 — Initial Buildpass:initialFirst developmentPhase AA → B → B7* → C
Pass 2 — Design Revisionpass:design-revisionFinal Figma arrives or Figma changes significantlyPhase A1 (re-analyse)A1 → B (fixes) → B7 (full)
Pass 3 — Polishpass:polishDesign Review feedback with minor issuesPhase BB (CSS fixes) → B7
Pass N — Hotfixpass:hotfixBug found post-QAPhase BB (fix) → B7

*Phase B7 in Pass 1: If no Figma exists, B7 (Pixel Perfect) is skipped during Pass 1. If a draft Figma exists, B7 runs against the draft but results are informational only (threshold failures don’t block). The hard gate B7 only applies in Pass 2+ when final Figma is available.

Track the Figma status on each task to know which pass is needed:

TagMeaningWhat Claude does
design:noneNo Figma exists for this moduleBuild from PRD/spec; skip Phase B7; Phase C OK if content model is known
design:draftFigma exists but not approvedBuild against draft; run B7 informally (no hard gate); expect Pass 2
design:finalFigma approved by clientFull B7 hard gate; pixel-perfect validation required
design:revisedFigma changed after initial buildPass 2 triggered; compare changes and fix

Claude sets the design tag at the start of each pass based on Figma availability.

The task re-enters 3. In Development for each new pass. The board shows it moving backwards — this is expected and normal.

Design TeamClaudeZoho BoardDesign TeamClaudeZoho BoardPass 1 — Initial Build (design:draft)⏸️ Task parked at 11. QA Accepted(weeks pass... Figma is finalized)Pass 2 — Design Revision (design:final)(tag: pass:design-revision)2. To Do → 3. In DevelopmentPhases A → B → B7 (soft) → C3 → 5 → 6 → 7 → 8Review against draft Figma8 → 9 → 10 → 11. QA Accepted11. QA Accepted → 3. In DevelopmentA1 (re-analyse) → B (fixes) → B7 (hard gate)3 → 5 → 6 → 7 → 8Review against FINAL Figma8 → 9 → 10 → 11 → 12. Done

Key rules:

  • When a task cycles back to 3. In Development, Claude posts a Re-entry Comment (see section 9.6)
  • The percent_complete resets to the re-entry point percentage (e.g., 0% for full re-entry, 50% for B-only)
  • The pass tag (pass:design-revision) is updated
  • Previous pass history is preserved in comments — never deleted

When the user says “Figma is ready for M{XX}” or “Design changed for M{XX}“:

3. In Development

(still building)

5-8 (in review pipeline)

11. QA Accepted

or 12. Done

Figma arrived

(was design:none)

Figma changed

(was design:draft)

Minor feedback

from Design Review

Figma arrives or changes

Module current status?

Update design tag

Continue current pass

Wait for current review

to complete, then re-enter

Re-enter development

What changed?

Full revision

Re-enter at A1

percent: 0%

tag: pass:design-revision

Compare changes

Re-enter at A1

percent: 0%

tag: pass:design-revision

Light polish

Re-enter at B

percent: 50%

tag: pass:polish

Status → 3. In Development

Post Re-entry Comment

When a task cycles back to 3. In Development for a new pass:

<b>Development Pass {N} — {Pass Type}</b>
<br>
<b>Task:</b> {taskName}
<b>Previous status:</b> {previousStatus}
<b>Reason:</b> {why re-entering development}
<b>Date:</b> {date}
<br>
<b>Design Status Change:</b>
<b>Previous:</b> {design:none|draft}
<b>Current:</b> {design:final|revised}
<b>Figma Desktop:</b> <a href="{figmaDesktopUrl}">{linkText}</a>
<b>Figma Mobile:</b> <a href="{figmaMobileUrl}">{linkText}</a>
<br>
<b>What Changed (Figma vs Current Implementation):</b>
- {change 1 — e.g., "Title now left-aligned instead of centered"}
- {change 2 — e.g., "New CTA button added below description"}
- {change 3 — e.g., "Mobile layout changed from stacked to side-by-side"}
<br>
<b>Re-entry Point:</b> Phase {A1|B|B7}
<b>Phases to Repeat:</b> {A1 → B → B7 | B → B7 | B7 only}
<b>Estimated Scope:</b> {small — CSS tweaks | medium — layout changes | large — structural rework}
<br>
<b>Progress Reset:</b> {percent}% (was {previousPercent}%)
<br>
<i>Status: "3. In Development". Pass {N} ({passType}) started.</i>

9.7 Modules Without Figma — Phase Adjustments

Section titled “9.7 Modules Without Figma — Phase Adjustments”

When building a module with design:none:

PhaseNormal (with Figma)Without Figma
A1 — Figma AnalysisAnalyse Figma designsSkip — use PRD/spec descriptions
A3 — TypesMatch Figma content structureDefine from PRD content model
A4 — StoriesFigmaFidelity story with exact Figma contentSkip FigmaFidelity — create Default with realistic content
B1 — ComponentMatch Figma pixel-perfectBuild reasonable layout from PRD; use similar modules as reference
B7 — Visual TestingHard gate: desktop ≤5%, mobile ≤10%Skip entirely — no Figma baseline to compare against
C — UmbracoElement Type matches Figma fieldsElement Type matches PRD fields — may need revision in Pass 2

When Figma arrives (Pass 2):

  1. A1 — Full Figma analysis (desktop + mobile)
  2. A4 — Create FigmaFidelity story with exact Figma content
  3. B1 — Align component to Figma (CSS/layout fixes)
  4. B7 — Fetch Figma baselines → run pixel-perfect (hard gate now applies)
  5. C — Verify Element Type fields match Figma; add migration if content model changed

Multi-pass modules affect cycle time metrics. Track separately:

MetricHow to handle
Total cycle timeMeasure from first 2. To Do to final 12. Done (includes all passes)
Per-pass cycle timeMeasure each 3. In Development11. QA Accepted cycle separately
Pass countTrack average passes per module — target: ≤ 2
Design-blocked timeTime between Pass 1 completion and Pass 2 start (waiting for Figma)
Rework ratioLines changed in Pass 2+ vs Pass 1 — lower is better (initial build was close)

ActionToolRequired paramsOptional params
Search taskszoho_search_tasksquerystatus (open/closed/all)
Get task detailszoho_get_tasktask_idraw
List taskszoho_list_tasksstatus, tasklist_id, owner, limit
List tasklistszoho_list_tasklists
List milestoneszoho_list_milestonesstatus
Create taskzoho_create_taskname, tasklist_iddescription, priority, cf_type, cf_figma, cf_storybook, cf_git, cf_environment, cf_doc_learn, parent_task_id, start_date, end_date
Update taskzoho_update_tasktask_idstatus_name, name, description, priority, percent_complete, start_date, end_date
Add commentzoho_add_commenttask_id, content (HTML)
List commentszoho_list_commentstask_id
Get custom fieldszoho_get_custom_fields
FieldAPI keyTypeValues
Typecf_typeEnumTask, Management & Governance, Design, Setup, Functional, Component, Module, Template, Content
Environmentcf_environmentEnumLOCAL, DEV, DEV-CLIENT, ACC-QUA, PROD
Figma URLcf_figmaURLFigma design link
Storybook URLcf_storybookURLStorybook story link
Git URLcf_gitURLRepository / branch link
DOC / Learncf_doc_learnURLDocumentation link

Zoho API uses MM-DD-YYYY format for dates. Always convert before sending:

March 21, 2026 → 03-21-2026

ResourcePattern
Zoho taskhttps://projects.zoho.com/portal/wygroup#zp/task-detail/{taskSystemId}
Azure DevOps PRhttps://dev.azure.com/Bycom/Savoy%20Signature/_git/Savoy%20Signature/pullrequest/{prId}
Storybook (module)https://savoy-dev-storybook.wycreative.com/?path=/docs/modules-m{xx}---{kebab-name}--docs
Storybook (component)https://savoy-dev-storybook.wycreative.com/?path=/docs/ui-{component-name}--docs
Umbraco backofficehttps://savoy-dev-cms.wycreative.com/umbraco
DEV site (Signature)https://savoy-dev-signature.wycreative.com
DEV site (per hotel)https://savoy-dev-{site-key}.wycreative.com
DEV site (direct, no auth)https://app-nextjs-savoy-dev.azurewebsites.net

PracticeWhy
Post “Development Started” comment + set tag ai:storybook immediatelyStakeholders know work has begun; next session knows where to resume
Update percent_complete at every phase transitionProgress bar visible in Zoho without opening the task
Use 4. Awaiting Input whenever blocked on human decisionMakes bottlenecks visible on the board
Post the Design Review Handoff comment with ALL fields filledDesign team’s only source of context — must be self-contained
Always link PR ↔ Zoho bidirectionallyTraceability works in both directions
Retry failed status updates, never skip silentlyStatus board must reflect reality
Re-fetch task_id if lost, never guessWrong task updates are worse than none
Only transition statuses you own (2→3, 3↔4, 3→5)Human gates belong to humans
PracticeWhy
Move 5 → 6 when picking up a PR reviewMakes “active review” visible vs “queued”
Move 6 → 7 when code approved, post approval commentDesign team gets notified
Move 6 → 3 when changes requestedClaude knows to fix and re-submit
Move 11 → 12 for final sign-offOnly PO/Tech Lead closes tasks
Check 4. Awaiting Input dailyClaude’s bottleneck — your response unblocks progress
Check 5. Dev — Ready for Review dailyPRs waiting for you
PracticeWhy
Move 7 → 8 when starting a design reviewMakes “active review” visible
Read the Design Review Handoff comment carefullyContains Figma links, Storybook URLs, acceptance criteria
Test in Storybook first (isolated), then DEV site (in context)Storybook shows all variants; DEV shows real data
Use Storybook theme switcher to test at least 3 themesTheming issues are common
Test at 375px, 768px, 1024px, 1440pxResponsive must be fluid between breakpoints
Post a detailed comment when approving or rejectingClaude needs specifics to fix issues
Move 8 → 9 when approved, or 8 → 3 when issues foundClear next step for QA or Claude
PracticeWhy
Move 9 → 10 when starting acceptance testingMakes “active testing” visible
Test on DEV site with real CMS contentStorybook uses mock data; DEV uses real API
Verify active=false hides the moduleRequired for every module
Post detailed comment when accepting or rejectingSpecifics help Claude fix faster
Move 10 → 11 when QA passesAwaits PO/Tech Lead final sign-off
#Anti-PatternCorrect Approach
1Starting development without a Zoho taskSearch first; create or request link if not found
2Starting work without “Development Started” commentPost comment + update tag + set percent immediately
3Using wrong status name (e.g., Dev - Ready)Copy exact string with em-dash: 5. Dev — Ready for Review
4Silently skipping failed status updateRetry once, then notify user
5Losing task_id in long sessionsAnnounce after lookup; re-fetch if lost
6Claude transitioning human-owned statusesOnly transition 2→3, 3↔4, 3→5 — everything else is human
7PR without Zoho task key in titleEvery PR title includes [P894-T{XXX}]
8Creating PR without posting Zoho commentPost structured comment with pre-PR checks
9Skipping Design Review Handoff commentDesign team has no context without it — CRITICAL
10Moving to 12. Done without PO/TL sign-offQA Accepted (11) is not Done (12) — separate gate
11Rolling back without notifying ZohoPost rollback comment + revert status to 3
12Not updating percent_complete during developmentProgress bar invisible — stakeholders can’t see progress within “In Development”
13Leaving task in 3. In Development between sessionsUpdate tag and percent so next session knows where to resume
14Building module without setting design:none or design:draft tagAlways set design availability tag at start — determines whether B7 is a hard gate
15Running B7 as hard gate when Figma doesn’t existB7 is skipped for design:none; informational-only for design:draft; hard gate only for design:final
16Re-entering development without a Re-entry CommentEvery pass must start with a structured comment explaining why, what changed, and which phases to repeat
17Deleting previous pass comments when cycling backAll pass history must be preserved in comments — never delete previous iterations

┌─────────┬────────┬──────────┬──────────┬───────────┬───────────┬────────────┬────────────┬────────────┬────────────┬────────────┬──────┐
│ Backlog │ To Do │ In Dev │ Awaiting │Dev—Ready │Dev—In │Design—Ready│Design—In │ QA—Ready │ QA—In │QA—Accepted │ Done │
│ │ │ │ Input │for Review │Review │for Review │Review │for Accept. │Acceptance │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │
│ future │ queue │ CLAUDE │ HUMAN │queue→Rui │ RUI │queue→Design│ DESIGN │queue→QA │ QA/PM │queue→PO/TL │ ✓ │
│ │ │ (active) │ (blocked)│ │ (active) │ │ (active) │ │ (active) │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │
│ grey │ blue │ purple │ orange │light blue │ blue │ light pink │ pink │light green │ green │dark green │green │
└─────────┴────────┴──────────┴──────────┴───────────┴───────────┴────────────┴────────────┴────────────┴────────────┴────────────┴──────┘
│ │ │ │
│◄─────────────────────────────────┘ (changes requested) │ │
│◄──────────────────────────────────────────────────────────┘ (design issues) │
│◄──────────────────────────────────────────────────────────────────────────────────┘ (bugs found)

For a high-level view, the 13 statuses can be grouped into 5 swimlanes:

QA

9. Ready

10. In Acceptance

11. Accepted

Design Review

7. Ready

8. In Review

Dev Review

5. Ready

6. In Review

AI Development

3. In Development

4. Awaiting Input

Backlog

1. Backlog

2. To Do

12. Done

AI_Development

Dev_Review

Design_Review

SignalMeaningAction
Tasks pile up in 4. Awaiting InputClaude is blocked waiting for humansTech Lead must respond
Tasks pile up in 5. Dev — Ready for ReviewPRs waiting for code reviewTech Lead must schedule review
Tasks pile up in 7. Design — Ready for ReviewCode approved but Design hasn’t startedDesign Team must pick up reviews
Tasks pile up in 9. QA — Ready for AcceptanceDesign approved but QA hasn’t testedQA/PM must test on DEV
Tasks pile up in 11. QA — AcceptedQA passed but not officially closedPO/Tech Lead must sign off
Empty 2. To DoClaude has nothing to work onPrioritize from Backlog
Multiple tasks in 3. In DevelopmentClaude may have stale sessionsCheck if sessions are active or abandoned

MetricHow to measureTarget
Claude development timeDuration in status 3 (In Development)Baseline: 4-8h per module
Awaiting Input timeDuration in status 4< 4 hours
Dev queue timeDuration in status 5 (Ready for Review)< 8 hours
Dev review timeDuration in status 6 (In Review)< 4 hours
Design queue timeDuration in status 7 (Ready for Review)< 24 hours
Design review timeDuration in status 8 (In Review)< 48 hours
QA queue timeDuration in status 9 (Ready for Acceptance)< 24 hours
QA acceptance timeDuration in status 10 (In Acceptance)< 24 hours
Sign-off queue timeDuration in status 11 (Accepted → Done)< 8 hours
End-to-end cycle time2. To Do12. Done< 1 week per module
Tasks completed per weekCount reaching 12. DoneIncreasing trend
Human bottleneck ratioTasks in queue statuses (5+7+9+11) vs total open< 30%

The Ready/In split enables measuring where time is actually spent:

30%15%15%10%10%5%5%5%5%"Typical Cycle Time Breakdown (Target)"Claude Development (active)Awaiting Input (blocked)Dev Queue (waiting)Dev Review (active)Design Queue (waiting)Design Review (active)QA Queue (waiting)QA Acceptance (active)Sign-off (waiting)

Key insight: In AI-driven development, the active development time (30%) is smaller than the total human review time (50%). The biggest optimization lever is reducing queue times (35%) — the time tasks sit waiting for humans to pick them up.

Queue/Active RatioWhat it meansAction
Queue >> Active (same team)Team has capacity but tasks aren’t being noticedImprove notifications / daily review routine
Active >> Queue (same team)Reviews are thorough but slowCheck if acceptance criteria are clear enough
Multiple teams with high queueSystemic issue — too many tasks in flightReduce WIP limits; batch fewer tasks before review cycles
Only one team with high queueSpecific team bottleneckAddress with that team directly

ResourceLocation
Zoho integration rules (canonical).claude/rules/zoho-integration.md
Git workflow rules.claude/rules/git-workflow.md
Anti-patterns.claude/rules/anti-patterns.md
CI/CD pipeline.azure/pipelines/deploy-dev.yml
Module lifecycle.claude/rules/frontend-module.md
PRD Indexdocs/PRD/00_Introduction_and_Index.md