Skip to content

WW-101 result

Implemented the DARS hybrid parser as a proposals-only flow.

Reused from WW-100

  • DarsPreParser delegates the complete deterministic pass to TranscriptPreParser, retaining its 100 ms regex timeouts, course/term/GPA/credit anchors, confidence scoring, and gap collection.
  • It changes the proposed SourceKind to Dars and adds the DARS-specific Requirements remaining enrichment gap.

New

  • IDarsProposalService and IDarsRequirementExtractor.
  • Separate token-gated, education.dars master-ANDed endpoints: propose-from-dars and propose-from-dars/enrich.
  • DarsRequirementExtractor follows ClaudeResumeExtractor's ILlmRouter/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.ClaudeCli proposal. An exact sourceText span 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 Debug
  • dotnet test tests/WorkWingman.Tests/WorkWingman.Tests.csproj --filter "FullyQualifiedName~Dars"