KTD1 third step: material parsing returns to its own capability. - ExtractTextWithAnchors + docx/anchor helpers move from squad/extract.go to internal/textextract (pure stdlib, no workflowdef dep) - squad/extract.go keeps only ExtractAdvisorBriefing (squad domain logic) - callers updated: squad context builders, bizdev materials, server chat_document_reader, materialindex pipeline - reverse dependency materialindex -> squad eliminated (KTD1 explicit goal) - module-boundaries.yaml: textextract declared + 4 edges - verified: build/vet clean, arch green, textextract/squad/materialindex/ bizdev tests green; server pre-existing env-dependent failure unchanged (issue #2, fails with and without this change)