fix(sec): sync foreign private issuer forms (20-F/6-K/40-F) - #4419
Merged
daniel3303 merged 1 commit intoAug 21, 2026
Merged
Conversation
The SEC filter mapping, form-name detection, and document extraction already fully support these three types -- 40-F/20-F report dates are even already used elsewhere to infer fiscal year-end when no 10-K exists -- but DocumentScraperOptions.DocumentTypesToSync's default list never included them alongside the domestic forms. A foreign filer with no 10-K/10-Q/8-K on file (e.g. OceanaGold, ticker OGC, CIK 0001487326, which files 6-K routinely and 40-F annually) synced as a known company with zero documents ever ingested, no matter how many 20-F/6-K/40-F filings it actually has in EDGAR. Not build/test verified locally -- no .NET SDK or Docker available in this environment.
daniel3303
approved these changes
Aug 21, 2026
daniel3303
left a comment
Owner
There was a problem hiding this comment.
The base-form change is correctly wired through the existing SEC mappings and generic ingestion path. Scoped Release build, formatting, configuration, and mapping tests pass. Foreign-form amendments can follow separately.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
DocumentScraperOptions.DocumentTypesToSync's default list never includedTwentyF/SixK/FortyF— a foreign private issuer's equivalents ofTenK/EightK(FortyFspecifically for Canadian filers using the MJDS annual-report regime). Everything downstream of that list already fully supports these three types:DocumentTypeExtensions.DatabaseToSecMappingalready maps all three to theirDocumentTypeFilterDocumentScraper's form-name detection, HTML/XBRL extraction, and PDF fallback (TryExtractPdfFallback, for paper-filed 6-K/20-F submissions that wrap a uuencoded PDF with no HTML) already handle themDocumentScraper.ForeignFilerAnnualFormsalready uses 20-F/40-F report dates to infer fiscal year-end when no 10-K existsBut because the sync's own default type list never included them, a company with no domestic 10-K/10-Q/8-K on file synced as a known company with zero documents ever ingested, regardless of how many 20-F/6-K/40-F filings it actually has in EDGAR. Found this via OceanaGold (ticker
OGC, CIK 1487326) — a Canadian gold miner that relisted on the NYSE in April 2026 and has been furnishing6-Ks since, none of which were ever synced.public List<DocumentType> DocumentTypesToSync { get; set; } = [ DocumentType.TenK, DocumentType.TenQ, DocumentType.EightK, DocumentType.TenKa, DocumentType.TenQa, DocumentType.EightKa, + DocumentType.TwentyF, + DocumentType.SixK, + DocumentType.FortyF, DocumentType.FormFour, ...Testing
No .NET SDK or Docker in the environment used to write the patch, so this wasn't build/test-verified locally — verification happened entirely against a separate live self-hosted deployment (rebuilt just the
workerservice, since this lives inEquibles.Sec.HostedServicewhich onlyEquibles.Worker.Hostruns):Documentdespite the SEC having real filings for it.ListCompanyDocumentstool that all of OGC's real6-Kfilings were ingested (12 documents, correctly typed and dated).data.sec.gov/submissions/CIK0001487326.json, not just this codebase) to confirm the match is exhaustive, not a partial sample: OGC's entire EDGAR history is 34 entries total (no archive pagination —filesis empty), of which exactly 12 are6-K— matching what got ingested 1:1. Zero20-F/40-Fexist for OGC yet (they only resumed active SEC reporting this April after a historical Rule 12h-6 deregistration, so their first annual-report deadline hasn't arrived), so this fix can't yet be confirmed against a live40-F/20-Ffor this specific company — but the sync mechanism treats all three added types identically (same filter mapping, same generic type-agnostic iteration inDocumentScraper), and6-Kingesting correctly is strong evidence the other two will too once one exists to fetch.ConfigurationTests.DocumentScraperOptions_DocumentTypesToSync_DefaultsToExpectedTypesfor the new count (18 → 21) and order.