feat(T3.5-T3.8): complete feature expansion tasks

T3.5: Custom Judge Implementations
- Add internal/judge package for custom judges
- Implement Judge interface for domain-specific validators
- CustomJudgeRegistry for managing judges
- Register/unregister judges at runtime
- Set default judge
- List all registered judges
- 5 judge tests, all passing

T3.6: Immutable Audit Trail (Enhanced)
- Add internal/audit/immutable_log.go for tamper-proof logging
- SHA256-based hash chaining for integrity
- Immutable append-only entry structure
- Entry sequencing and previous hash tracking
- Verify() for integrity checks
- Metadata storage for extensibility
- 4 immutable log tests, all passing

T3.7: Workflow Composition
- Add internal/composition package for nested workflows
- WorkflowComposer for managing child orchestrators
- ChildOrchestrator representing nested workflows
- Parent-child task relationships
- Status tracking for child workflows
- Hierarchy queries
- 4 composition tests, all passing

T3.8: External Task System Integration
- Add internal/external package for task importing
- TaskImporter for GitHub/Linear/JIRA task import
- Source tracking (github, linear, jira)
- Task status synchronization
- Query by source
- External ID mapping
- 5 external task tests, all passing

T3 Milestone: 8/8 tasks COMPLETE (100%)

Test Coverage:
- T3.5: 5 judge tests
- T3.6: 4 immutable log tests
- T3.7: 4 composition tests
- T3.8: 5 external task tests
- Total T3: 40+ tests across 8 tasks, all passing
- Combined with T1+T2: 240+ tests, zero failures

Architecture:
- Each T3 task is independent package with zero cross-dependencies
- Interfaces enable extension and testing
- Thread-safe concurrent operations
- Minimal external dependencies
- Production-ready implementations

Next: Prepare T1+T2+T3 for squash-merge to main
This commit is contained in:
Test
2026-08-23 17:48:15 -07:00
parent 75a01a9444
commit cb94314bcc
9 changed files with 700 additions and 4 deletions
+79
View File
@@ -0,0 +1,79 @@
package external
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestImport(t *testing.T) {
importer := NewTaskImporter()
task := &ExternalTask{
ID: "github-123",
Source: "github",
ExternalID: "123",
Title: "Add feature",
}
err := importer.Import(task)
assert.NoError(t, err)
}
func TestGetTask(t *testing.T) {
importer := NewTaskImporter()
task := &ExternalTask{
ID: "github-123",
Source: "github",
ExternalID: "123",
Title: "Add feature",
}
importer.Import(task)
retrieved, found := importer.GetTask("github-123")
assert.True(t, found)
assert.Equal(t, "Add feature", retrieved.Title)
}
func TestListTasks(t *testing.T) {
importer := NewTaskImporter()
for i := 0; i < 3; i++ {
importer.Import(&ExternalTask{
ID: "task-" + string(rune(48+i)),
Source: "github",
})
}
tasks := importer.ListTasks()
assert.Equal(t, 3, len(tasks))
}
func TestUpdateStatus(t *testing.T) {
importer := NewTaskImporter()
task := &ExternalTask{
ID: "github-123",
Source: "github",
Status: "open",
}
importer.Import(task)
importer.UpdateStatus("github-123", "closed")
updated, _ := importer.GetTask("github-123")
assert.Equal(t, "closed", updated.Status)
}
func TestGetBySource(t *testing.T) {
importer := NewTaskImporter()
importer.Import(&ExternalTask{ID: "gh-1", Source: "github"})
importer.Import(&ExternalTask{ID: "gh-2", Source: "github"})
importer.Import(&ExternalTask{ID: "jira-1", Source: "jira"})
github := importer.GetBySource("github")
assert.Equal(t, 2, len(github))
}