Skip to content

Investigate whether structured-XML 8-Ks occur in EDGAR (gates two deferred SPAC-redemption findings) #167

Description

@sroussey

Background

Two deferred findings from the SPAC redemption (§4c) review (PR #166) both hinge on one empirical, currently-unverified assumption: that 8-K filings are effectively always HTML, never structured edgarSubmission XML. Form_8_K.parse only populates form8K.formData when it detects edgarSubmission in the first 500 chars of the fetched body; for an HTML primary doc (and for the full-submission .txt, which starts with <SEC-HEADER>) it returns {}.

If that assumption holds, both findings below are non-issues. If real SPAC 8-Ks do arrive as edgarSubmission XML with a populated formData, they become real (if narrow) bugs. This issue is to check the data and decide.

Finding #1 — escalation gate vs. processForm8K trigger set disagree

  • Fetch escalation (src/task/forms/ProcessAccessionDocFormTask.ts) decides whether to pull the full .txt using hasRedemptionTriggerItem(items)filing-metadata items only.
  • processForm8K (src/sec/forms/miscellaneous-filings/Form_8_K.storage.ts) derives its trigger set from extractItemCodes(items, form8K) — metadata items + form8K.formData.items.item (XML).
  • A trigger item (5.07/2.01/8.01) present only in the XML, not in metadata, would skip escalation → fullSubmissionText undefined → redemption extraction silently not attempted (no dead-letter).

Only reachable if form8K.formData.items can carry an item the submissions-API items field omits — i.e. only if XML 8-Ks exist and their item lists can diverge from metadata.

Finding #2 — full-.txt escalation drops XML periodOfReport

  • On escalation, Form_8_K.parse sees the .txt (<SEC-HEADER>…) → returns {}, so effectiveReportDate = form8K.formData?.periodOfReport || report_date || null loses the XML periodOfReport.
  • Regression vs. a primary-doc fetch only exists if the primary doc would have parsed to a populated formData (i.e. it's edgarSubmission XML) and metadata report_date is null (best-effort path). Then a §4a milestone event_date degrades to filing_date.

Again gated on XML 8-Ks actually existing.

Investigation

  1. Sample real 8-Ks across a range of filers/dates (and specifically known SPACs) and check how many parse to a non-empty form8K (i.e. the body contains edgarSubmission). A quick probe: fetch primary docs for a batch of 8-K accessions and count Object.keys(Form_8_K.parse("8-K", body)).length > 0.
  2. For any XML 8-Ks found, check whether formData.items.item ever contains a trigger item absent from the submissions-API items field (Finding chore(deps): bump bun-types from 1.2.14 to 1.2.15 #1), and whether formData.periodOfReport is present while metadata report_date is null (Finding chore(deps): bump @sroussey/parse-address from 2.4.0 to 2.4.2 #2).

Outcome

Context: PR #166; deferred-findings discussion in that review.

🤖 Generated with Claude Code

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions