Template: Gap Resolution Log - listenrightmeow/signal-driven-development GitHub Wiki
Template: Gap Resolution Log
File: templates/gap-resolution-log.md
The gap resolution log documents how each gap was resolved. It captures the rationale behind every architectural decision -- the value of a resolution is in the reasoning, not just the outcome. Each log is an immutable snapshot.
Structure
1. Metadata Header
> **Source**: Gap Report — [Domain Name] (Pass N)
> **Date**: [YYYY-MM-DD]
> **Decision authority**: [Name of architect making the decisions]
> **Resolved**: [X/Y] ([Z accepted, W rejected])
2. Resolution Summary
| Category | Total | Accepted | Accepted w/ Modification | Rejected |
|---|---|---|---|---|
| Structural Gaps | ||||
| Heuristic Gaps | ||||
| Language Gaps | ||||
| Decision Gaps | ||||
| Total |
3. Individual Resolutions
### [GAP-ID]: [Short Description] — [ACCEPTED | ACCEPTED W/ MODIFICATION | REJECTED]
**Resolution**: [What was decided and why. Include the reasoning.]
**Structural impact**: [What changed in the domain specification.]
Examples of structural impact:
+1 invariant on Appointment aggregateAggregate dissolved — demoted to domain serviceNew saga introduced: VisitLifecycleSagaNo change — documented as intentional override
4. Deviations from Recommendation
| Gap ID | Recommendation | Actual Decision | Rationale for Deviation |
|---|---|---|---|
This table captures cases where the architect diverged from the gap report's recommendation. These are not failures -- they are documented architectural decisions.
5. Follow-ups Identified
| Item | Source Gap | Description | Target |
|---|---|---|---|
| [Next pass | ADR | Backlog] |
Follow-ups are items discovered during resolution that don't belong in this pass but should be tracked.
Resolution Outcomes
Accept
The gap recommendation is adopted. The domain specification is changed accordingly.
When to accept:
- The gap identifies a genuine structural deficiency
- The recommendation aligns with domain understanding
- The fix is straightforward and doesn't introduce new complexity
Accept with Modification
The recommendation is correct in principle but needs adjustment in execution.
When to modify:
- The gap is real but the suggested fix doesn't quite fit the domain
- A simpler change achieves the same goal
- The recommendation needs to account for constraints not visible in the specification
Reject
The current design is intentional. The rationale for rejection is documented.
When to reject:
- The gap flags a pattern that is intentional in this domain
- The heuristic threshold doesn't apply to this specific context
- The cost of change outweighs the benefit, with documented reasoning
Important: Rejecting a gap is a valid architectural decision. The value is in the documented rationale, not in achieving 100% acceptance rate.
Writing Good Rationale
The rationale is the most important part of a resolution. Future-you (or a teammate) will need to understand why a decision was made, not just what was decided.
Good rationale:
- "Treatment was decomposed into a saga because the multi-step process spans two aggregates and requires compensation on failure"
- "Rejected: the 4-aggregate context is intentional because all four aggregates participate in a single transaction boundary"
Bad rationale:
- "Fixed"
- "Accepted the recommendation"
- "It seemed right"