WW-101 result¶
Implemented the DARS hybrid parser as a proposals-only flow.
Reused from WW-100¶
DarsPreParserdelegates the complete deterministic pass toTranscriptPreParser, retaining its 100 ms regex timeouts, course/term/GPA/credit anchors, confidence scoring, and gap collection.- It changes the proposed
SourceKindtoDarsand adds the DARS-specificRequirements remainingenrichment gap.
New¶
IDarsProposalServiceandIDarsRequirementExtractor.- Separate token-gated,
education.darsmaster-ANDed endpoints:propose-from-darsandpropose-from-dars/enrich. DarsRequirementExtractorfollowsClaudeResumeExtractor'sILlmRouter/harness check, fenced strict-JSON prompt, defensive JSON parsing, and fail-soft behavior. Ordinary CLI unavailability, timeout, non-zero exit, empty output, or invalid JSON returns no proposals.- Every enriched field is a
ProposalSource.ClaudeCliproposal. An exactsourceTextspan must exist in the submitted report before any requirement is accepted.
Re-import merge building block¶
mergeAcademicRecord provides isolated, unit-tested merge logic for T5 (WW-102) to wire into the
import-diff accept/reject UI. It matches courses by normalized course code plus term and requirements
by normalized category. Matches update in place, new rows append, and unmatched existing rows remain.
Terms merge by ID. This ticket does not deliver end-to-end re-import behavior in the UI.
Verification¶
dotnet build WorkWingman.slnx -c Debugdotnet test tests/WorkWingman.Tests/WorkWingman.Tests.csproj --filter "FullyQualifiedName~Dars"