WING-132 Result¶
Outcome¶
- Added honest
JobPosting.Sourceprovenance withUnknownas the default. - Marked LinkedIn scraper output as
LinkedInand SimplifyJobs adapter output asSimplifyJobs. - Added the flag-gated
ResyncFromJobSourcesAsyncsibling path and API endpoint without changing the existingResyncFromLinkedInAsyncbody. - Added focused coverage for the feature gate, case-insensitive deduplication, per-source failure isolation, caller cancellation, and provenance defaults/mapping.
Files touched¶
frontend/src/app/core/models.tssrc/WorkWingman.Api/Controllers/JobsController.cssrc/WorkWingman.Core/Interfaces/IJobQueueService.cssrc/WorkWingman.Core/Models/JobPosting.cssrc/WorkWingman.Core/Models/JobSource.cssrc/WorkWingman.Infrastructure/Automation/LinkedInJobsScraper.cssrc/WorkWingman.Infrastructure/Services/JobQueueService.cssrc/WorkWingman.Infrastructure/Sources/SimplifyJobsSource.cstests/WorkWingman.Tests/JobPostingSourceTests.cstests/WorkWingman.Tests/JobSourceQueueTests.cstests/WorkWingman.Tests/PipelineOutlookServiceTests.cstests/WorkWingman.Tests/SimplifyJobsSourceTests.cstests/WorkWingman.Tests/StabilityContextServiceTests.cs
Dedupe rationale¶
Public-source postings do not have a LinkedIn URL identity. Ats.ApplyUrl is the durable application target shared by the already-landed source adapter and the queue, so ingestion deduplicates nonblank apply URLs case-insensitively against persisted jobs and jobs fetched earlier in the same run. Blank apply URLs are not treated as equal because absence of an identity is not evidence that two postings are the same.
Verification¶
dotnet build WorkWingman.slnx -c Debug: exit 0; 0 errors, 22 warnings.- Targeted
dotnet test: exit 0; 68 passed, 0 failed, 0 skipped. frontend:npx tsc -p tsconfig.json --noEmit: exit 0; 0 TypeScript errors.
Review findings and dispositions¶
- Required result document missing: fixed by adding this file.
- Cancellation propagation lacked explicit regression coverage: fixed with a caller-cancellation test that verifies later sources are not fetched and the queue remains unchanged.
- Feature gate, empty-safe source injection, case-insensitive apply-URL dedupe, per-source exception isolation, provenance mapping, and preservation of the LinkedIn resync body: reviewed with no finding.
- Claude chair unavailable because the usage governor denied external Claude calls at RED tier; no bypass attempted.
- Gemini review attempts were unavailable in headless mode/time-limited; local Ollama produced no usable finding output. The house councils were time-limited after remaining queued. A compressed independent staged-diff review completed and its findings are disposed above.