DEV Community

Daniel Wu
Daniel Wu

Posted on

A Practical Workflow for Contributing to a Large, Structured Codebase

This is the workflow I follow before I use AI agents to implement any feature or bug fix. 🧭

Requirements/Specification
 ↓
Design/Architecture
 ↓
AI Code Generation
 ↓
Human Review
 ↓
Build & Static Analysis
 ↓
Testing & Validation
 ↓
Defect Resolution
 ↓
Security & Compliance Review
 ↓
Release
 ↓
Production Monitoring

vs

Claude Code
    ↓
Implements feature
    ↓
Codex QA Agent
    ↓
Runs application
    ↓
Tests happy path
    ↓
Tests edge cases
    ↓
Tests error handling
    ↓
Produces QA report

This will resolve the self-review bias, confirmation bias, or AI-to-AI bias.

1️⃣ Understand Before Writing Code

Before touching any code, I try to understand what I'm building and why. I usually start by reading:

  • specs/<module>/<TICKET>-<slug>.md
  • plan/<module>/<TICKET>-<slug>.md
  • status.md

Then I review the project conventions:

  • specs/CONVENTIONS.md
  • specs/conventions/core-porting.md

Finally, I read the existing implementation (entities, services, mappers, etc.) so my changes follow the existing architecture instead of introducing a new style.


💡 Pro-Tip
Good code fits into the codebase. Great code looks like it was always there.

2️⃣ Plan the Change

Once I understand the requirements, I identify which architectural layers are affected. I always respect the dependency order:

Schema / Entities / DAOs
        ↓
Mappers / DTOs
        ↓
Service Layer
        ↓
Application Layer
        ↓
Controllers


I don't jump ahead of dependencies.

If a change is complicated or ambiguous, I document the approach before writing code.

---

## 3️⃣ Write the Code

While implementing, I follow the repository's rules. Some examples:

| Rule | Detail |---|---|---|
| DTOs | Generated from `schema.yml` — never handwritten |
| Status values | Sourced only from the Core Porting specification |
| Traceability | Every ported behavior includes a source citation |

Citation formats I use:

- `← Source <path>`
- `← PS §...`
- `← BR-###`

Beyond repository rules, I also try to:

- ✅ Match existing naming conventions
- ✅ Keep comments minimal and meaningful
- ✅ Make small, focused changes instead of massive rewrites

---

## 4️⃣ Verify Everything

After implementation comes verification.

I run the relevant module tests:

Enter fullscreen mode Exit fullscreen mode


bash
mvn -pl test


Locally I usually include `-am`, since Liquibase is disabled and schema changes need to be applied first.

Because this repository doesn't currently have independent QA, I also:

- Verify that all tests pass
- Run mutation tests if coverage is uncertain
- Exercise the runtime flow instead of relying only on successful compilation

If something fails, **I report it honestly** rather than hiding the failure. 🛠️

---

## 5️⃣ Finish Cleanly

Before considering the work complete, I:

- Reference the requirement or rule IDs implemented
- Update `status.md` only after owner approval
- Commit and push only when requested
- Create an ADR if I intentionally deviate from established conventions

If there's an exception, it should be **documented — not silently introduced**.

---

## 🔁 The Entire Workflow

Enter fullscreen mode Exit fullscreen mode


plaintext
Read the specification
↓
Read the conventions
↓
Understand the existing code
↓
Plan the implementation
↓
Write minimal changes
↓
Test and verify
↓
Report results honestly




Following this process helps me write code that integrates naturally with the existing codebase, minimizes regressions, and makes future maintenance much easier.

---

*If you follow a similar workflow (or have tweaks that work better for your team), I'd love to hear about it in the comments!* 👇
Enter fullscreen mode Exit fullscreen mode

Top comments (0)