@@ -1695,7 +1695,7 @@ which no deal walk reads):
16951695| ` 2.01 ` | ` completed ` | unconditional |
16961696| ` 1.01 ` | ` definitive_agreement ` | the submission carries a merger-shaped EX-2 exhibit AND the event is not dated before the date floor |
16971697| ` 1.02 ` | ` terminated ` | a deal was pending as of that filing, or the exhibits are merger-shaped |
1698- | ` 5.07 ` | ` vote ` | the pending deal had a definitive-agreement or proxy date |
1698+ | ` 5.07 ` | ` vote ` | a deal was pending as of that filing AND it had a proxy date |
16991699
17001700Item ` 8.01 ` carries ** no lifecycle mapping at all** — ` mapItemCodesToSpacEvents `
17011701falls through its ` default: break ` and writes nothing. A termination disclosed
@@ -1842,15 +1842,123 @@ consideration) and observes the target company (`relation: "merger-proxy:target"
18421842correlates each extraction onto the matching ` spac_deal ` by filing-date window —
18431843_ deriving_ ` target_name ` / ` target_cik ` / ` pipe_amount ` (a later filing supersedes
18441844an earlier one — definitive over preliminary, revised over definitive), which
1845- retires the 8-K path's positional merge-preserve. Only the ** definitive merger**
1846- statements ` DEFM14A ` and ` DEFM14C ` emit the ` proxy ` event (→ ` proxy_date ` /
1847- ` status = proxy ` ): a consent deal (14C) has no ` 8-K 5.07 ` vote, so the definitive
1848- 14C is its only approval-stage signal. Preliminary (` PREM14A ` /` PREM14C ` ) and revised
1849- (` DEFR14A ` /` PRER14A ` ) proxies are extraction-only. S-4 is deferred (newco-CIK linkage). Configure the
1845+ retires the 8-K path's positional merge-preserve. Preliminary (` PREM14A ` /` PREM14C ` )
1846+ and revised (` DEFR14A ` /` PRER14A ` ) proxies are extraction-only. S-4 is deferred
1847+ (newco-CIK linkage). Configure the
18501848model via ` SEC_MERGER_PROXY_MODEL ` (default ` claude-sonnet-5 ` ) and an optional
18511849confidence floor via ` SEC_MERGER_PROXY_CONFIDENCE_FLOOR ` (falls back to the shared
18521850` SEC_S1_CONFIDENCE_FLOOR ` when unset).
18531851
1852+ #### Which statements emit the ` proxy ` event
1853+
1854+ The ` proxy ` event (→ ` proxy_date ` / ` status = proxy ` ) is ** two-tier** , and the
1855+ tiers differ in what counts as evidence:
1856+
1857+ - The ** definitive merger** statements ` DEFM14A ` / ` DEFM14C ` emit it on the form
1858+ symbol alone — the symbol says the meeting is about a combination, so the
1859+ event still lands when the merger section is absent or low-confidence and the
1860+ section dead-letters. (A consent deal (14C) has no ` 8-K 5.07 ` vote, so the
1861+ definitive 14C is its only approval-stage signal.)
1862+ - The ** general definitive** statements ` DEF 14A ` / ` DEF 14C ` — which is where
1863+ most SPACs actually vote their combination — emit it only on ** two**
1864+ conjunctive pieces of document evidence: an extracted deal AND
1865+ ` seeksCombinationApproval ` (` proxies-information-statements/seeksCombinationApproval.ts ` ),
1866+ a deterministic scan for a numbered proposal item naming the filer's defined
1867+ ` Business Combination Proposal ` , or a request to approve/adopt the ** agreement**
1868+ (business combination agreement / agreement and plan of merger / merger
1869+ agreement).
1870+
1871+ The extracted deal alone is not evidence, because an ** extension** proxy recites
1872+ the announced combination at length: ` S1_SECTIONS.BUSINESS_COMBINATION ` accepts a
1873+ bare ` The Business Combination ` heading, so the section is found, the model
1874+ returns a target, and the filing looked exactly like a merger proxy. That is a
1875+ silent corruption, not a missing row — a ` proxy ` event OPENS a deal by itself in
1876+ ` spacDealGrouping.ts ` , which makes the vehicle's next item ` 5.07 ` a merger
1877+ ` vote ` , which makes any Form 25/15 inside the 90-day post-approval window a
1878+ ` completed ` de-SPAC, with ` surviving_name ` promoted onto ` current_name ` .
1879+
1880+ The gate is deliberately ** deterministic rather than a model schema field** .
1881+ The failure costs are asymmetric: a false positive corrupts the primary answer
1882+ with no trace, while a false negative only degrades a fallback — a real close
1883+ files an Item 2.01, which maps to ` completed ` unconditionally. A model field
1884+ also could not repair existing rows without re-paying the AI bill, and making it
1885+ required would force an extractor version cycle. Same reasoning as the ownership
1886+ subtotal and risk-caption heading guards: enforce it, don't trust the prompt.
1887+
1888+ Two rules the patterns must keep, both measured over 348 real SIC-6770
1889+ ` DEF 14A ` / ` DEF 14C ` statements (9 merger proxies, 339 extension / annual /
1890+ other; the rule scores 9/9 recall at ** 0 false positives** ):
1891+
1892+ - ** Never match the term anywhere in the document.** Every extension proxy
1893+ carries "as if they had voted against a business combination proposal", and
1894+ many cross-reference the combination's own proposal in another filing. A
1895+ whole-document test for ` business combination proposal ` fired on 24 of the
1896+ 348, ** all** of them extension or annual meetings. Both patterns are therefore
1897+ line-shaped (≤ 300 chars) and the defined-term one is anchored at line start.
1898+ - ** The approval object must be the AGREEMENT.** A bare
1899+ ` to approve … business combination ` is the standard extension wording — "to
1900+ approve an amendment … to extend the date by which the Company must consummate
1901+ a business combination".
1902+
1903+ There is deliberately no extension-exclusion term: a proxy asking for an
1904+ extension AND for approval of the combination is a genuine merger proxy and must
1905+ still emit.
1906+
1907+ Extraction is unchanged either way — the ` spac_merger_extraction ` row is written
1908+ whether or not the gate passes — and the verdict is recorded on it as
1909+ ` seeks_combination_approval ` . ` NULL ` means the gate was not evaluated: the row
1910+ predates it, or the form symbol alone decides (the "M" forms never pay the
1911+ full-document render). The backfill keys on that NULL, so it must stay
1912+ distinguishable from a recorded ` false ` .
1913+
1914+ ** Retraction.** ` recordMergerProxy ` deletes a ` proxy ` event for the accession
1915+ when the caller now decides the filing is not approval-stage, mirroring the
1916+ sibling deletes in ` recordDeregistration ` / ` recordUnitSplit ` / ` recordCompleted ` .
1917+ Reclassification therefore runs in both directions and a replay demotes the deal
1918+ instead of leaving the old verdict standing. The delete is scoped to that one
1919+ accession, so it can only retract what a previous run of the same filing wrote.
1920+
1921+ No extractor version bump: the persisted extraction rows are unchanged and still
1922+ correct, and the derived event is rebuildable from the document with no model
1923+ call.
1924+
1925+ ** Recovery ceremony.** Databases populated before the gate existed carry false
1926+ closes. Re-run the proxies, then let the listing-removal classifier re-derive
1927+ the Form 25/15 verdicts that were built on them:
1928+
1929+ ``` bash
1930+ sec extractor backfill merger-proxy # re-derives the verdict; retracts stale proxy events
1931+ sec extractor backfill 25-15 # repeat until it reports `processed 0`
1932+ ```
1933+
1934+ The first re-selects exactly the general definitive proxies whose
1935+ ` seeks_combination_approval ` is still NULL, and extinguishes itself once each
1936+ has a verdict. The second is the fixpoint sweep documented above: ` filterTodo `
1937+ re-derives each accession's kind against the live classifier, so a stale
1938+ ` completed ` on an earlier accession keeps a later one classifying ` completed `
1939+ until the earlier one is corrected.
1940+
1941+ Find the affected rows first — every ` proxy ` event on a general definitive form,
1942+ and the closes standing on one:
1943+
1944+ ``` sql
1945+ SELECT cik, accession_number, event_date, form FROM spac_event
1946+ WHERE event_type = ' proxy' AND form IN (' DEF 14A' ,' DEF 14C' ) ORDER BY cik, event_date;
1947+
1948+ SELECT p .cik , c .accession_number AS close_accession, c .form , c .event_date
1949+ FROM spac_event p JOIN spac_event c ON c .cik = p .cik AND c .event_type = ' completed'
1950+ WHERE p .event_type = ' proxy' AND p .form IN (' DEF 14A' ,' DEF 14C' )
1951+ AND c .form IN (' 25' ,' 25/A' ,' 25-NSE' ,' 25-NSE/A' ,' 15-12B' ,' 15-12G' ,' 15-15D' ,' 20-F' ,' 20-F/A' );
1952+ ```
1953+
1954+ ⚠️ Expect status ** regressions** on real CIKs as the false closes unwind —
1955+ ` completed ` back to ` searching ` / ` deal_announced ` , and ` surviving_name ` /
1956+ ` post_merger_* ` / the ` current_* ` promotion dropping back to the ` spac_* ` mirror
1957+ (those five columns are derived strictly from a completed deal and are never
1958+ merged forward). That is the correction, not a loss: every change is captured in
1959+ ` spac_history ` / ` ChangeLog ` , and genuinely completed SPACs are re-filled by
1960+ ` sec spac backfill-despac ` .
1961+
18541962A proxy ingested before its issuer's ` spac ` row exists (e.g. the S-1 lands later)
18551963hits the known-SPAC gate and no-ops — recording a successful run, so the normal
18561964unprocessed-run sweep never revisits it. ` sec spac backfill-merger-proxies `
@@ -2141,7 +2249,9 @@ by default over all filings of its forms; extractors whose candidate set is
21412249narrower add a descriptor entry (the ` redemption ` / ` loi ` sub-extractors select
21422250known-SPAC trigger-item 8-Ks) and extractors whose recorded success can be a
21432251gated no-op override ` filterTodo ` (` merger-proxy ` keeps candidates lacking a
2144- ` spac_merger_extraction ` row, since its known-SPAC gate records ` success: true ` ).
2252+ ` spac_merger_extraction ` row, since its known-SPAC gate records ` success: true ` ,
2253+ plus the general definitive proxies whose ` seeks_combination_approval ` verdict is
2254+ still NULL — a self-extinguishing clause, since the re-run records one).
21452255The default needing-work predicate is a bulk anti-join against ` extractor_runs `
21462256at the active version, exported as ` defaultFilterTodo ` so a descriptor that only
21472257WIDENS it does not restate it. The ` redemption ` / ` loi ` descriptors do exactly
0 commit comments