{
"issueNumber": 355,
"branchName": "rc/multi-tenant",
"generatedAt": "2026-04-08T22:10:00Z",
"stories": [
{
"id": "S1",
"title": "Add owner column to TaskEntity, JobEntity, and WebhookDeliveryEntity",
"priority": 1,
"dependsOn": [],
"acceptanceCriteria": [
"All three entities have @Column({ default: 'AgentSDE' }) owner: string",
"TaskEntity unique constraint is ['owner', 'issue', 'repo']",
"tsc --noEmit passes"
],
"passes": false,
"completedAt": null
},
{
"id": "S2",
"title": "Scope TaskStateService queries and creation by owner via TenantConfigService",
"priority": 2,
"dependsOn": [
"S1"
],
"acceptanceCriteria": [
"findByIssueAndRepo includes owner in where clause",
"findByStatus/findByStatuses/findAll include owner filter",
"createTask sets owner from TenantConfigService.getConfig().org",
"TenantModule imported in TaskStateModule"
],
"passes": false,
"completedAt": null
},
{
"id": "S3",
"title": "Scope SqliteJobQueue creation and polling by owner via TenantConfigService",
"priority": 3,
"dependsOn": [
"S1"
],
"acceptanceCriteria": [
"enqueue() sets owner on created job",
"processNext() QueryBuilder filters by owner in both outer and inner query",
"onModuleInit() stale-job recovery filters by owner",
"TenantModule imported in QueueModule"
],
"passes": false,
"completedAt": null
},
{
"id": "S4",
"title": "Scope WebhookController delivery creation by owner via TenantConfigService",
"priority": 4,
"dependsOn": [
"S1"
],
"acceptanceCriteria": [
"deliveryRepo.create() includes owner from TenantConfigService",
"TenantModule imported in WebhookModule"
],
"passes": false,
"completedAt": null
},
{
"id": "S5",
"title": "Update unit tests with owner fixtures and TenantConfigService mocks",
"priority": 5,
"dependsOn": [
"S2",
"S3",
"S4"
],
"acceptanceCriteria": [
"npm run test passes",
"npm run lint passes",
"Tests verify owner is included in queries"
],
"passes": false,
"completedAt": null
}
]
}