Raised from the 2026-03-28 full-codebase architecture and code-quality review.
Problem
createIssueFromRequirement() stores GitHub issue traceability identifiers as #<number>, while the sync path later assumes the identifier is a raw integer string and parses it with Integer.parseInt(...).
Evidence
backend/src/main/java/com/keplerops/groundcontrol/domain/requirements/service/GitHubIssueSyncService.java
backend/src/test/java/com/keplerops/groundcontrol/integration/SyncIntegrationTest.java
backend/src/test/java/com/keplerops/groundcontrol/unit/domain/GitHubIssueSyncServiceTest.java
Why this matters
The product path that creates issues from requirements cannot reliably round-trip through the sync/enrichment path. The existing integration coverage only validates manually-stored raw numeric identifiers, not the identifier shape the app itself writes.
Definition of done
- Choose one canonical format for GitHub issue identifiers.
- Make issue creation and sync/update logic use that same format.
- Add integration coverage for the exact create-from-requirement path.
- Ensure previously-created links either remain supported or are migrated safely.
Raised from the 2026-03-28 full-codebase architecture and code-quality review.
Problem
createIssueFromRequirement()stores GitHub issue traceability identifiers as#<number>, while the sync path later assumes the identifier is a raw integer string and parses it withInteger.parseInt(...).Evidence
backend/src/main/java/com/keplerops/groundcontrol/domain/requirements/service/GitHubIssueSyncService.javabackend/src/test/java/com/keplerops/groundcontrol/integration/SyncIntegrationTest.javabackend/src/test/java/com/keplerops/groundcontrol/unit/domain/GitHubIssueSyncServiceTest.javaWhy this matters
The product path that creates issues from requirements cannot reliably round-trip through the sync/enrichment path. The existing integration coverage only validates manually-stored raw numeric identifiers, not the identifier shape the app itself writes.
Definition of done