← PM Workflow

Case Study: Writing an EPIC with Claude Code

Recurring Course Assignment — a real session walkthrough showing the iterative approach

What This Shows

This is a walkthrough of a single Claude Code session that produced the EPIC document for the Recurring Course Assignment feature. The session demonstrates three patterns worth adopting:

  1. Set an agenda — scope what fits in one session, don't try to do everything
  2. Iterate section by section — draft, get feedback, revise, approve, then move on
  3. Use Claude's tools — pull data from Jira, explore the codebase, save context for next time

Starting with an Agenda

The session started by laying out everything to accomplish, then scoping what fit:

Items 4 and 5 were deferred to separate sessions — different modes of work (see phases). The agenda kept us focused: when the EPIC was done, we knew to stop rather than drift into UI design.

Briefing Claude on Changes

This was a continuation of a multi-session project. The prior design had 13 system components covering three use cases. The updated approach simplified radically — but Claude had the old context in memory. The PM walked through what changed:

PM Components need to be reconsidered. We are not going to build some of them in V1. Admin UX Design needs to be redone. Won't have single schedule principle. Story breakdown and build sequence need to be updated. Model comparison may not be relevant. The solution is a combination of the two. Scope boundaries are out of date. New scope will be more restrictive.
Claude Here's the updated v1 as I understand it: [laid out the 5-capability model with Active/Inactive, dynamic LP progress, auto-assign, "Use for Next Cycle", and newcomer skip]. Does this capture the updated approach accurately?
PM This is it.
Pattern: Confirm understanding before writing.

Claude summarized back in a structured format. The PM confirmed before any document writing started. This prevents building on a misunderstanding.

Stress-Testing Your Own Thinking

The PM had an architectural insight — Active/Inactive is the foundational primitive, and v2 scheduling rules are just automated triggers for the same state transition. The PM asked Claude to argue against it:

PM What's your argument against my instinct? What's the gaps in my thinking?
Claude The main gap: Active/Inactive in v1 is per-component (LP-wide). UC2 needs it per-learner. [Detailed 3 secondary concerns about missing states, semantic divergence, and workflow assumptions]
PM Even in v1, the execution of "active" rule is at the individual user's assignment level. We set up audiences, but tasks are set up for individual audience members. So it does reach into per-assignment.
Claude You're right — I overstated the gap. The task generation is already per-assignment in v1. The v2 shift is only in what triggers the evaluation, not in how it executes.
Pattern: Ask Claude to challenge you, then correct its challenge.

This exchange sharpened the argument. Claude raised a valid-sounding concern (per-component vs per-learner cardinality), the PM corrected it with domain knowledge (execution is already per-assignment), and they arrived at a stronger framing than either started with. The resulting insight made it into the EPIC document.

Using Existing Work as a Template

Rather than inventing a document structure, the PM pointed Claude to an existing EPIC (Custom Themes) and asked it to follow that structure. Claude read the file, extracted the pattern, and proposed an outline:

  1. Feature Overview
  2. Business Case
  3. Known Use Cases and Considerations
  4. Key Decisions and Concepts
  5. Workflow Overview
  6. Feature Breakdown
  7. Reporting Considerations
  8. Scope: V1 vs. After V1
  9. Supporting Assets

The PM then added what was missing: a before/after comparison table and a reporting section for topics to discuss with the PM for Analytics. The outline was agreed before writing began.

Section-by-Section Iteration

This is the core of the workflow. Claude drafts one section at a time. The PM reviews, gives specific feedback, Claude revises, the PM approves, and they move on. Never write the whole document then review — errors compound.

Example: Feature Overview

Feature Overview — Draft 1 Draft

Claude's first draft included "track completion outside the system" and ended with "deliver the annual compliance workflow immediately."

PM "Track completion outside the system" is not accurate. There's no easy way to track different cycles together. When using acronyms, always spell out the first time. Don't need to say "The LP model doesn't support it." "This feature introduces" should be reframed as how admins manage and how learners experience. The last sentence — don't need "immediately," that's too boastful.
Feature Overview — Final Approved

Revised to frame around admin and learner experience. Acronyms spelled out. Accurate problem description. Confident but not boastful tone.

Pattern: Give specific, actionable feedback.

Each correction was concrete: "this phrase is inaccurate," "reframe from this angle," "remove this word." Claude can't improve on "make it better" — it needs to know what's wrong and what direction to go.

Example: Business Case

PM I would take the business case up a level. I want to touch the following points: 1. Customer retention — frequently requested, admins have voice in vendor selection, embed in essential processes. 2. New sales — sets us apart, frequently asked in RFPs, consolidating tech stacks. Do look up customers who requested in the enhancement tickets.

Claude searched the Jira enhancement board (AIS/AIT projects, type = Improvement) and found three relevant tickets with customer names: TE Connectivity, EnlivenHealth, and a group of seven customers on a course expiration request. These went directly into the Business Case section.

Pattern: Let Claude pull data while you stay in flow.

Instead of pausing to search Jira separately, the PM told Claude what to look for. Claude searched, filtered irrelevant results, and brought back customer names with ticket IDs. The PM stayed focused on the document structure.

Example: Decisions Section

The Decisions section went through multiple rounds of feedback — not on the content, but on how it was organized:

PM Maybe order differently. Scope choice first — what UC we prioritize. Then deep copy. Then active status — what does active mean, what does inactive mean. Then manual toggle.
PM #3 — not sure this is decided. It's clear we need active/inactive. But whether it's a mode on the LP needs to be decided. A new "mode" lets us isolate legacy LPs and lower regression risk. On the other hand, even existing LPs can benefit.
PM Maybe rename the section from "Decision" to something else. "Key decisions and concepts"?
Pattern: Separate content accuracy from structural feedback.

The decisions were right, but the ordering and framing needed work. The PM gave feedback in passes — reorder first, then refine individual items, then rename the section. Claude handled each pass cleanly because each was focused.

Code Investigation for Next Session

With the EPIC done, the next session would tackle UI reconciliation — how Active/Inactive fits alongside existing LP controls. The PM gave Claude screenshots of the current admin UI, and Claude searched the codebase to understand the implementation:

What Claude found

  • Component data model fields (startAfterDays, gatingChannelId, dueAfterDays)
  • Audience enrollment field (isEnrollAtPace)
  • All relevant JSP, JS, and Java files
  • How the save API validates component data

Saved for next session

  • Memory file with data model details
  • Key file paths for the LP component page
  • Reconciliation questions to start with
  • Updated context document
Pattern: End a session by setting up the next one.

Claude saves context to memory files, so the next session starts with full knowledge of what was decided, what code was found, and what questions remain. No re-briefing needed.

Session Output

One session produced:

Patterns to Reuse