# Module Template

How to implement a **module** (bounded feature set) inside an **existing** service.

Use when the domain clearly belongs to an already-owned database/service (e.g. CRM sales engine phases inside `crm`, Accounting sub-phases inside `accounting`).

If the capability must be reused across many business domains, create an independent service ([service-template.md](service-template.md)) instead.

Registry field template: [templates/module-template.md](../templates/module-template.md).

## When to Add a Module vs a Service

| Choose module | Choose service |
| --- | --- |
| Same aggregate ownership | Shared platform capability |
| Same DB already owns the data | New sole DB required |
| Extends existing permission prefix | New permission prefix `{service}.*` |
| Phase slice of an active service | Cross-module reuse (Loyalty, Communication) |

## Design Steps

1. Confirm ownership in [module-boundaries.md](../architecture/module-boundaries.md) and [module-registry.md](../module-registry.md).
2. Define Objective / Scope / Out of Scope with [phase-template.md](phase-template.md).
3. Add entities ([entity-template.md](entity-template.md)), repositories, services, validators, permissions, events, APIs.
4. Additive Alembic migration in the **owning** service only.
5. Tests + docs + handover.
6. Update module registry “Current Phase” / version / events / permissions.

## Module Checklist

### Architecture

- [ ] Stays within service boundary
- [ ] No cross-DB access
- [ ] No foreign model imports
- [ ] Provider contracts only if calling platforms

### Ownership

| Field | Value |
| --- | --- |
| Parent service | |
| Permission prefix | (usually parent’s `{service}.*`) |
| Database | Parent DB |
| Public surface | APIs + events listed in phase doc |

### Implementation Layers

| Layer | Standard |
| --- | --- |
| Models | [entity-template.md](entity-template.md) |
| Repositories | [repository-template.md](repository-template.md) |
| Services | [service-layer-template.md](service-layer-template.md) |
| APIs | [api-template.md](api-template.md) |
| Events | [event-template.md](event-template.md) |
| Tests | [testing-template.md](testing-template.md) |

### Tenant Awareness

- [ ] `tenant_id` on business tables
- [ ] Filters on all queries
- [ ] Isolation tests

### Documentation

- [ ] Phase doc
- [ ] Module registry entry updated
- [ ] Event catalog / API reference if public surface changed
- [ ] Progress / next-steps
- [ ] Handover

### Non-Responsibilities

List what this module must **not** own (copy from parent boundaries and phase Out of Scope):

-

## Related Documents

- [Service Template](service-template.md)
- [Master Prompt](master-prompt.md)
- [Module Boundaries](../architecture/module-boundaries.md)
- [Module Registry](../module-registry.md)
- [templates/module-template.md](../templates/module-template.md)
