SPB Git

spb/firc0001_uqo

Public

N8: rule-based baseline (snapshot rules.py) vs LLM on a stratified seeded sample of 60,000 ledger sections; rules-on-full vs rules-on-focused recall-loss bound

Items: FIRC0001-AI_C-19, THEO-09.
30,000 productive + 30,000 zero-mention sections (inverse-probability weights; DuckDB USING SAMPLE applied in subqueries), 200 s, 4 workers.
P(rules >= 1 | LLM >= 1) = 85.7% (10-K 97.4, 10-Q 94.4, 8-K 69.2); weighted P(LLM >= 1 | rules >= 1) = 32.5%; type overlap on co-detected sections 84.6% (M&A 96.8%);
rules on _focus(text) recover 26.2% of the rules-on-full-text mentions in over-budget sections (10-K MD&A 20.8%, 8-K 84.2%).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Simon-Pierre Boucher committed (Nov 5, 2026) parent f7f4811 Browse files

10 changed files +300 −0

added code/audit/a08_rules_baseline.py +88 −0
@@ -0,0 +1,88 @@
1 +"""N8 - rule-based baseline (snapshot rules.py) vs the LLM output on a stratified seeded sample of ledger
2 +sections, plus rules-on-full vs rules-on-focused text (recall-loss bound, THEO-09). Read-only; CPU only.
3 +"""
4 +from __future__ import annotations
5 +import json, sys, time
6 +from pathlib import Path
7 +import multiprocessing as mp
8 +sys.path.insert(0, str(Path(__file__).resolve().parent))
9 +from common import *
10 +from spid.extract.rules import RuleExtractor
11 +from spid.extract.llm import _focus
12 +
13 +N_PROD = 30000; N_ZERO = 30000
14 +RX = RuleExtractor()
15 +
16 +def work(item):
17 + sid, name, text = item
18 + full = RX.extract(text=text, accession_number="a", cik="c", section_id=sid, section_name=name)
19 + foc = RX.extract(text=_focus(text), accession_number="a", cik="c", section_id=sid, section_name=name)
20 + return (sid, len(full), sorted({m.project_type for m in full}), len(foc), sorted({m.project_type for m in foc}), len(text),
21 + [(m.project_type, m.confidence, m.amount_usd, m.description[:200]) for m in full][:20])
22 +
23 +def main():
24 + r = Run("rules")
25 + con = connect(SPID_DB)
26 + tmin = con.execute("select min(extracted_at) from extracted_sections").fetchone()[0]
27 + con.execute(f"""CREATE TEMP TABLE led AS SELECT e.section_id, e.n_mentions, CASE WHEN e.extracted_at = TIMESTAMP '{tmin}' THEN 'backfilled_june' ELSE 'october' END run,
28 + f.form_type, m.section_name, m.word_count FROM extracted_sections e JOIN src_filings f ON f.accession_number = e.accession_number
29 + JOIN (SELECT section_id, section_name, word_count FROM src_sections UNION ALL SELECT section_id, section_name, word_count FROM spid_sections) m USING (section_id)""")
30 + N_prod_pop = con.execute("select count(*) from led where n_mentions>0").fetchone()[0]
31 + N_zero_pop = con.execute("select count(*) from led where n_mentions=0").fetchone()[0]
32 + # DuckDB applies USING SAMPLE before WHERE: the stratum filter must sit in a subquery
33 + con.execute(f"CREATE TEMP TABLE samp AS SELECT *, 'productive' stratum, {N_prod_pop}/{N_PROD}.0 w FROM (SELECT * FROM led WHERE n_mentions>0) USING SAMPLE reservoir({N_PROD} ROWS) REPEATABLE ({SEED})")
34 + con.execute(f"INSERT INTO samp SELECT *, 'zero', {N_zero_pop}/{N_ZERO}.0 FROM (SELECT * FROM led WHERE n_mentions=0) USING SAMPLE reservoir({N_ZERO} ROWS) REPEATABLE ({SEED})")
35 + assert con.execute("select count(*) filter (where n_mentions>0), count(*) filter (where n_mentions=0) from samp").fetchone() == (N_PROD, N_ZERO)
36 + n_s = con.execute("select count(*) from samp").fetchone()[0]
37 + print(f"sample {n_s} sections (pop productive {N_prod_pop}, zero {N_zero_pop})", flush=True)
38 + cur = con.execute("""SELECT s.section_id, s.section_name, t.text FROM samp s JOIN (SELECT section_id, text FROM src_sections UNION ALL SELECT section_id, text FROM spid_sections) t USING (section_id)""")
39 + out = []; t0 = time.time(); done = 0
40 + ctx = mp.get_context("fork")
41 + with ctx.Pool(4) as pool:
42 + while True:
43 + rows = cur.fetchmany(2000)
44 + if not rows: break
45 + out.extend(pool.imap_unordered(work, rows, chunksize=25))
46 + done += len(rows)
47 + print(f" {done}/{n_s} sections, {time.time()-t0:.0f}s", flush=True)
48 + import pyarrow as pa, pyarrow.parquet as pq
49 + tbl = pa.table({"section_id": [o[0] for o in out], "rules_n": [o[1] for o in out], "rules_types": [o[2] for o in out], "rules_focus_n": [o[3] for o in out],
50 + "rules_focus_types": [o[4] for o in out], "nchar": [o[5] for o in out], "rules_mentions": [json.dumps(o[6]) for o in out]})
51 + pq.write_table(tbl, r.out / "rules_mentions.parquet") # stays on the node
52 + con.register("rt", tbl)
53 + con.execute("""CREATE TEMP TABLE lt AS SELECT section_id, list_distinct(list(project_type)) llm_types FROM project_mentions GROUP BY 1""")
54 + con.execute("""CREATE TEMP TABLE J AS SELECT s.*, r.rules_n, r.rules_types, r.rules_focus_n, r.rules_focus_types, r.nchar, coalesce(l.llm_types, []) llm_types,
55 + r.rules_n > 0 rules_pos, s.n_mentions > 0 llm_pos, len(list_intersect(r.rules_types, coalesce(l.llm_types, []))) > 0 type_overlap
56 + FROM samp s JOIN rt r USING (section_id) LEFT JOIN lt l USING (section_id)""")
57 + agg = """count(*) n_sampled, round(sum(w)) n_weighted,
58 + count(*) FILTER (WHERE llm_pos) llm_pos, count(*) FILTER (WHERE rules_pos) rules_pos,
59 + round(100.0*count(*) FILTER (WHERE llm_pos AND rules_pos)/nullif(count(*) FILTER (WHERE llm_pos),0),2) p_rules_given_llm,
60 + round(100.0*sum(w) FILTER (WHERE llm_pos AND rules_pos)/nullif(sum(w) FILTER (WHERE rules_pos),0),2) p_llm_given_rules_weighted,
61 + round(100.0*sum(w) FILTER (WHERE rules_pos)/sum(w),2) rules_pos_pct_weighted, round(100.0*sum(w) FILTER (WHERE llm_pos)/sum(w),2) llm_pos_pct_weighted,
62 + round(100.0*count(*) FILTER (WHERE llm_pos AND rules_pos AND type_overlap)/nullif(count(*) FILTER (WHERE llm_pos AND rules_pos),0),2) type_overlap_pct_codetected,
63 + round(100.0*sum(w) FILTER (WHERE llm_pos AND NOT rules_pos)/sum(w),2) llm_only_pct_w, round(100.0*sum(w) FILTER (WHERE rules_pos AND NOT llm_pos)/sum(w),2) rules_only_pct_w,
64 + round(100.0*sum(w) FILTER (WHERE llm_pos = rules_pos)/sum(w),2) agreement_pct_w,
65 + round(avg(rules_n) FILTER (WHERE llm_pos),3) rules_mentions_per_llm_pos_section, round(avg(rules_n) FILTER (WHERE NOT llm_pos),3) rules_mentions_per_llm_zero_section"""
66 + r.dump("agreement_by_form_item.csv", con, f"SELECT form_type, section_name item, {agg} FROM J GROUP BY 1,2 ORDER BY 1,2")
67 + r.dump("agreement_by_form.csv", con, f"SELECT form_type, {agg} FROM J GROUP BY 1 ORDER BY 1")
68 + r.dump("agreement_by_run.csv", con, f"SELECT run, {agg} FROM J GROUP BY 1 ORDER BY 1")
69 + r.dump("agreement_overall.csv", con, f"SELECT 'all' scope, {agg} FROM J")
70 + r.dump("type_agreement.csv", con, """
71 + WITH x AS (SELECT unnest(llm_types) t, rules_types FROM J WHERE llm_pos AND rules_pos)
72 + SELECT t llm_type, count(*) n, count(*) FILTER (WHERE list_contains(rules_types, t)) same_type_in_rules, round(100.0*count(*) FILTER (WHERE list_contains(rules_types, t))/count(*),2) pct FROM x GROUP BY 1 ORDER BY 2 DESC""")
73 + r.dump("focus_recall_loss.csv", con, """
74 + SELECT form_type, section_name item, count(*) FILTER (WHERE nchar > 9000) n_over_budget,
75 + sum(rules_n) FILTER (WHERE nchar > 9000) rules_full, sum(rules_focus_n) FILTER (WHERE nchar > 9000) rules_focused,
76 + round(100.0*(1 - sum(rules_focus_n) FILTER (WHERE nchar > 9000)*1.0/nullif(sum(rules_n) FILTER (WHERE nchar > 9000),0)),2) pct_rules_mentions_lost_to_focus,
77 + round(100.0*count(*) FILTER (WHERE nchar > 9000 AND rules_n > 0 AND rules_focus_n = 0)/nullif(count(*) FILTER (WHERE nchar > 9000 AND rules_n > 0),0),2) pct_sections_lost_entirely,
78 + round(100.0*sum(w) FILTER (WHERE nchar > 9000 AND rules_n > 0 AND rules_focus_n = 0)/nullif(sum(w) FILTER (WHERE nchar > 9000 AND rules_n > 0),0),2) pct_sections_lost_entirely_w
79 + FROM J GROUP BY 1,2 ORDER BY 1,2""")
80 + r.dump("focus_recall_loss_overall.csv", con, """
81 + SELECT 'over_9000_chars' scope, count(*) n, sum(rules_n) rules_full, sum(rules_focus_n) rules_focused, round(100.0*(1 - sum(rules_focus_n)*1.0/nullif(sum(rules_n),0)),2) pct_lost,
82 + round(100.0*sum(w*rules_n)/nullif(sum(w*rules_n) + 0,0),2) dummy FROM J WHERE nchar > 9000""")
83 + r.dump("disagreement_strata.csv", con, """SELECT form_type, section_name item, run, llm_pos, rules_pos, count(*) n_sampled, round(sum(w)) n_weighted FROM J GROUP BY 1,2,3,4,5 ORDER BY 1,2,3,4,5""")
84 + r.notes["sample"] = {"productive": N_PROD, "zero": N_ZERO, "pop_productive": N_prod_pop, "pop_zero": N_zero_pop, "seed": SEED}
85 + r.finish()
86 +
87 +if __name__ == "__main__":
88 + main()
added results/rules/agreement_by_form.csv +4 −0
@@ -0,0 +1,4 @@
1 +form_type,n_sampled,n_weighted,llm_pos,rules_pos,p_rules_given_llm,p_llm_given_rules_weighted,rules_pos_pct_weighted,llm_pos_pct_weighted,type_overlap_pct_codetected,llm_only_pct_w,rules_only_pct_w,agreement_pct_w,rules_mentions_per_llm_pos_section,rules_mentions_per_llm_zero_section
2 +10-K,8890,141548.0,5393,7614,97.42,28.17,73.88,21.37,86.24,0.55,53.07,46.38,14.785,5.893
3 +10-Q,29399,577609.0,13658,18518,94.35,28.73,43.54,13.26,87.79,0.75,31.03,68.22,12.397,3.501
4 +8-K,21711,403941.0,10949,8984,69.18,48.64,21.62,15.2,77.94,4.68,11.1,84.21,1.331,0.198
added results/rules/agreement_by_form_item.csv +16 −0
@@ -0,0 +1,16 @@
1 +form_type,item,n_sampled,n_weighted,llm_pos,rules_pos,p_rules_given_llm,p_llm_given_rules_weighted,rules_pos_pct_weighted,llm_pos_pct_weighted,type_overlap_pct_codetected,llm_only_pct_w,rules_only_pct_w,agreement_pct_w,rules_mentions_per_llm_pos_section,rules_mentions_per_llm_zero_section
2 +10-K,business,2434,28674.0,1861,2354,99.79,39.7,91.49,36.4,89.77,0.08,55.17,44.75,10.332,6.503
3 +10-K,full_body,81,1057.0,58,81,100.0,30.76,100.0,30.76,98.28,,69.24,30.76,42.948,40.565
4 +10-K,md_and_a,2931,28341.0,2477,2890,99.88,51.17,95.67,49.01,90.99,0.06,46.72,53.22,21.193,16.165
5 +10-K,properties,1452,28595.0,672,925,81.55,20.39,52.71,13.18,54.2,2.43,41.96,55.6,3.109,1.145
6 +10-K,quantitative_disclosures,912,27245.0,68,308,91.18,4.25,30.02,1.4,83.87,0.12,28.74,71.14,11.309,0.868
7 +10-K,risk_factors,1080,27636.0,257,1056,99.22,5.31,97.43,5.21,81.18,0.04,92.25,7.71,10.362,8.486
8 +10-Q,controls_and_procedures,3732,91568.0,1038,1130,91.71,48.51,12.02,6.36,86.76,0.53,6.19,93.29,2.021,0.351
9 +10-Q,financial_statements,5665,90162.0,3438,5552,99.77,22.17,96.24,21.38,91.08,0.05,74.91,25.04,13.171,11.539
10 +10-Q,full_document,13,256.0,6,13,100.0,13.12,100.0,13.12,50.0,,86.88,13.12,25.667,28.429
11 +10-Q,legal_proceedings,2209,67714.0,99,229,49.49,4.58,8.87,0.82,61.22,0.41,8.46,91.13,1.869,0.147
12 +10-Q,md_and_a,8838,92144.0,7214,8688,99.54,45.64,95.76,43.9,89.04,0.2,52.06,47.74,16.222,13.111
13 +10-Q,quantitative_disclosures,2674,82305.0,107,492,70.09,3.07,16.64,0.73,65.33,0.22,16.13,83.66,1.879,0.232
14 +10-Q,risk_factors,2712,72947.0,510,1099,90.98,11.41,31.27,3.92,89.87,0.35,27.71,71.94,4.982,2.269
15 +10-Q,unregistered_sales,3556,80512.0,1246,1315,58.59,18.02,28.21,8.68,64.52,3.59,23.13,73.28,1.471,0.465
16 +8-K,full_body,21711,403941.0,10949,8984,69.18,48.64,21.62,15.2,77.94,4.68,11.1,84.21,1.331,0.198
added results/rules/agreement_by_run.csv +3 −0
@@ -0,0 +1,3 @@
1 +run,n_sampled,n_weighted,llm_pos,rules_pos,p_rules_given_llm,p_llm_given_rules_weighted,rules_pos_pct_weighted,llm_pos_pct_weighted,type_overlap_pct_codetected,llm_only_pct_w,rules_only_pct_w,agreement_pct_w,rules_mentions_per_llm_pos_section,rules_mentions_per_llm_zero_section
2 +backfilled_june,8370,153998.0,4287,4561,79.75,34.53,36.05,15.61,81.37,3.16,23.6,73.24,6.361,2.055
3 +october,51630,969100.0,25713,30555,86.71,32.24,40.02,14.88,85.07,1.98,27.12,70.9,9.192,2.68
added results/rules/agreement_overall.csv +2 −0
@@ -0,0 +1,2 @@
1 +scope,n_sampled,n_weighted,llm_pos,rules_pos,p_rules_given_llm,p_llm_given_rules_weighted,rules_pos_pct_weighted,llm_pos_pct_weighted,type_overlap_pct_codetected,llm_only_pct_w,rules_only_pct_w,agreement_pct_w,rules_mentions_per_llm_pos_section,rules_mentions_per_llm_zero_section
2 +all,60000,1123098.0,30000,35116,85.72,32.52,39.48,14.98,84.57,2.14,26.64,71.22,8.788,2.595
added results/rules/disagreement_strata.csv +103 −0
@@ -0,0 +1,103 @@
1 +form_type,item,run,llm_pos,rules_pos,n_sampled,n_weighted
2 +10-K,business,backfilled_june,False,False,2,64.0
3 +10-K,business,backfilled_june,False,True,108,3438.0
4 +10-K,business,backfilled_june,True,True,395,2215.0
5 +10-K,business,october,False,False,74,2355.0
6 +10-K,business,october,False,True,389,12381.0
7 +10-K,business,october,True,False,4,22.0
8 +10-K,business,october,True,True,1462,8198.0
9 +10-K,full_body,backfilled_june,False,True,23,732.0
10 +10-K,full_body,backfilled_june,True,True,58,325.0
11 +10-K,md_and_a,backfilled_june,False,False,4,127.0
12 +10-K,md_and_a,backfilled_june,False,True,82,2610.0
13 +10-K,md_and_a,backfilled_june,True,False,3,17.0
14 +10-K,md_and_a,backfilled_june,True,True,401,2249.0
15 +10-K,md_and_a,october,False,False,34,1082.0
16 +10-K,md_and_a,october,False,True,334,10631.0
17 +10-K,md_and_a,october,True,True,2073,11625.0
18 +10-K,properties,backfilled_june,False,False,65,2069.0
19 +10-K,properties,backfilled_june,False,True,80,2546.0
20 +10-K,properties,backfilled_june,True,False,13,73.0
21 +10-K,properties,backfilled_june,True,True,124,695.0
22 +10-K,properties,october,False,False,338,10758.0
23 +10-K,properties,october,False,True,297,9453.0
24 +10-K,properties,october,True,False,111,622.0
25 +10-K,properties,october,True,True,424,2378.0
26 +10-K,quantitative_disclosures,backfilled_june,False,False,82,2610.0
27 +10-K,quantitative_disclosures,backfilled_june,False,True,53,1687.0
28 +10-K,quantitative_disclosures,backfilled_june,True,True,14,79.0
29 +10-K,quantitative_disclosures,october,False,False,516,16424.0
30 +10-K,quantitative_disclosures,october,False,True,193,6143.0
31 +10-K,quantitative_disclosures,october,True,False,6,34.0
32 +10-K,quantitative_disclosures,october,True,True,48,269.0
33 +10-K,risk_factors,backfilled_june,False,False,3,95.0
34 +10-K,risk_factors,backfilled_june,False,True,161,5124.0
35 +10-K,risk_factors,backfilled_june,True,True,40,224.0
36 +10-K,risk_factors,october,False,False,19,605.0
37 +10-K,risk_factors,october,False,True,640,20371.0
38 +10-K,risk_factors,october,True,False,2,11.0
39 +10-K,risk_factors,october,True,True,215,1206.0
40 +10-Q,controls_and_procedures,backfilled_june,False,False,88,2801.0
41 +10-Q,controls_and_procedures,backfilled_june,False,True,12,382.0
42 +10-Q,controls_and_procedures,backfilled_june,True,False,3,17.0
43 +10-Q,controls_and_procedures,backfilled_june,True,True,48,269.0
44 +10-Q,controls_and_procedures,october,False,False,2428,77281.0
45 +10-Q,controls_and_procedures,october,False,True,166,5284.0
46 +10-Q,controls_and_procedures,october,True,False,83,465.0
47 +10-Q,controls_and_procedures,october,True,True,904,5069.0
48 +10-Q,financial_statements,backfilled_june,False,False,5,159.0
49 +10-Q,financial_statements,backfilled_june,False,True,89,2833.0
50 +10-Q,financial_statements,backfilled_june,True,True,127,712.0
51 +10-Q,financial_statements,october,False,False,100,3183.0
52 +10-Q,financial_statements,october,False,True,2033,64708.0
53 +10-Q,financial_statements,october,True,False,8,45.0
54 +10-Q,financial_statements,october,True,True,3303,18522.0
55 +10-Q,full_document,october,False,True,7,223.0
56 +10-Q,full_document,october,True,True,6,34.0
57 +10-Q,legal_proceedings,backfilled_june,False,False,74,2355.0
58 +10-Q,legal_proceedings,backfilled_june,False,True,9,286.0
59 +10-Q,legal_proceedings,backfilled_june,True,False,1,6.0
60 +10-Q,legal_proceedings,october,False,False,1856,59075.0
61 +10-Q,legal_proceedings,october,False,True,171,5443.0
62 +10-Q,legal_proceedings,october,True,False,49,275.0
63 +10-Q,legal_proceedings,october,True,True,49,275.0
64 +10-Q,md_and_a,backfilled_june,False,False,6,191.0
65 +10-Q,md_and_a,backfilled_june,False,True,59,1878.0
66 +10-Q,md_and_a,backfilled_june,True,False,1,6.0
67 +10-Q,md_and_a,backfilled_june,True,True,256,1436.0
68 +10-Q,md_and_a,october,False,False,111,3533.0
69 +10-Q,md_and_a,october,False,True,1448,46088.0
70 +10-Q,md_and_a,october,True,False,32,179.0
71 +10-Q,md_and_a,october,True,True,6925,38833.0
72 +10-Q,quantitative_disclosures,backfilled_june,False,False,92,2928.0
73 +10-Q,quantitative_disclosures,backfilled_june,False,True,7,223.0
74 +10-Q,quantitative_disclosures,backfilled_june,True,False,4,22.0
75 +10-Q,quantitative_disclosures,backfilled_june,True,True,4,22.0
76 +10-Q,quantitative_disclosures,october,False,False,2058,65504.0
77 +10-Q,quantitative_disclosures,october,False,True,410,13050.0
78 +10-Q,quantitative_disclosures,october,True,False,28,157.0
79 +10-Q,quantitative_disclosures,october,True,True,71,398.0
80 +10-Q,risk_factors,backfilled_june,False,False,83,2642.0
81 +10-Q,risk_factors,backfilled_june,False,True,32,1019.0
82 +10-Q,risk_factors,backfilled_june,True,False,1,6.0
83 +10-Q,risk_factors,backfilled_june,True,True,20,112.0
84 +10-Q,risk_factors,october,False,False,1484,47234.0
85 +10-Q,risk_factors,october,False,True,603,19193.0
86 +10-Q,risk_factors,october,True,False,45,252.0
87 +10-Q,risk_factors,october,True,True,444,2490.0
88 +10-Q,unregistered_sales,backfilled_june,False,False,67,2133.0
89 +10-Q,unregistered_sales,backfilled_june,False,True,27,859.0
90 +10-Q,unregistered_sales,backfilled_june,True,False,18,101.0
91 +10-Q,unregistered_sales,backfilled_june,True,True,24,135.0
92 +10-Q,unregistered_sales,october,False,False,1658,52772.0
93 +10-Q,unregistered_sales,october,False,True,558,17761.0
94 +10-Q,unregistered_sales,october,True,False,498,2793.0
95 +10-Q,unregistered_sales,october,True,True,706,3959.0
96 +8-K,full_body,backfilled_june,False,False,2370,75435.0
97 +8-K,full_body,backfilled_june,False,True,400,12732.0
98 +8-K,full_body,backfilled_june,True,False,824,4621.0
99 +8-K,full_body,backfilled_june,True,True,1908,10699.0
100 +8-K,full_body,october,False,False,6983,222261.0
101 +8-K,full_body,october,False,True,1009,32115.0
102 +8-K,full_body,october,True,False,2550,14300.0
103 +8-K,full_body,october,True,True,5667,31779.0
added results/rules/focus_recall_loss.csv +16 −0
@@ -0,0 +1,16 @@
1 +form_type,item,n_over_budget,rules_full,rules_focused,pct_rules_mentions_lost_to_focus,pct_sections_lost_entirely,pct_sections_lost_entirely_w
2 +10-K,business,2226,22675,8375,63.07,1.44,2.51
3 +10-K,full_body,81,3424,344,89.95,6.17,12.57
4 +10-K,md_and_a,2866,59769,12445,79.18,2.1,3.71
5 +10-K,properties,141,1123,378,66.34,4.35,6.85
6 +10-K,quantitative_disclosures,122,1227,223,81.83,4.08,4.43
7 +10-K,risk_factors,1046,9612,2697,71.94,8.35,9.75
8 +10-Q,controls_and_procedures,111,1464,255,82.58,6.45,9.29
9 +10-Q,financial_statements,5549,70907,17249,75.67,6.17,10.19
10 +10-Q,full_document,13,353,17,95.18,46.15,54.02
11 +10-Q,legal_proceedings,76,265,123,53.58,1.79,2.53
12 +10-Q,md_and_a,8577,138076,34652,74.9,3.87,7.46
13 +10-Q,quantitative_disclosures,130,265,137,48.3,6.41,7.08
14 +10-Q,risk_factors,734,6845,1804,73.64,5.96,8.04
15 +10-Q,unregistered_sales,259,1385,375,72.92,5.33,9.49
16 +8-K,full_body,2997,6847,5767,15.77,1.78,2.6
added results/rules/focus_recall_loss_overall.csv +2 −0
@@ -0,0 +1,2 @@
1 +scope,n,rules_full,rules_focused,pct_lost,dummy
2 +over_9000_chars,24928,324237,84841,73.83,100.0
added results/rules/manifest.json +44 −0
@@ -0,0 +1,44 @@
1 +{
2 + "package": "rules",
3 + "script": "/Users/simon-pierreboucher/firc0001_review/scripts/a08_rules_baseline.py",
4 + "script_sha256": "7995daa858488f2d67cde688ab4d9c4d3468389c3f781a27c28c85edf8804a63",
5 + "started": "2026-11-05T14:45:00",
6 + "ended": "2026-11-05T14:48:20",
7 + "wall_seconds": 200.2,
8 + "node": "m3u96b",
9 + "python": "3.12.15",
10 + "duckdb": "2.0.0",
11 + "threads": 4,
12 + "memory_limit": "24GB",
13 + "seed": 20261105,
14 + "databases": {
15 + "/Users/simon-pierreboucher/UQO_RESEARCH_DB/project-db/data/db/spid.duckdb": {
16 + "bytes": 3155701760,
17 + "mtime": "2026-10-28T12:21:11.091389"
18 + },
19 + "/Users/simon-pierreboucher/UQO_RESEARCH_DB/data/duckdb/edgar_research.duckdb": {
20 + "bytes": 73500995584,
21 + "mtime": "2026-10-27T21:34:46.297884"
22 + }
23 + },
24 + "read_only": true,
25 + "row_counts": {
26 + "agreement_by_form_item.csv": 15,
27 + "agreement_by_form.csv": 3,
28 + "agreement_by_run.csv": 2,
29 + "agreement_overall.csv": 1,
30 + "type_agreement.csv": 21,
31 + "focus_recall_loss.csv": 15,
32 + "focus_recall_loss_overall.csv": 1,
33 + "disagreement_strata.csv": 102
34 + },
35 + "notes": {
36 + "sample": {
37 + "productive": 30000,
38 + "zero": 30000,
39 + "pop_productive": 168230,
40 + "pop_zero": 954868,
41 + "seed": 20261105
42 + }
43 + }
44 +}
\ No newline at end of file
added results/rules/type_agreement.csv +22 −0
@@ -0,0 +1,22 @@
1 +llm_type,n,same_type_in_rules,pct
2 +ma_integration,15735,15227,96.77
3 +geographic_expansion,2289,835,36.48
4 +capex_program,2241,1238,55.24
5 +partnership,2168,1151,53.09
6 +plant_construction,2097,854,40.72
7 +drug_pipeline,2021,1870,92.53
8 +cost_reduction,1694,1303,76.92
9 +rd_program,1597,1369,85.72
10 +product_launch,1488,731,49.13
11 +manufacturing_expansion,1199,1015,84.65
12 +infrastructure,1045,188,17.99
13 +technology_deployment,842,221,26.25
14 +digital_transformation,815,109,13.37
15 +erp_implementation,744,498,66.94
16 +sustainability,304,148,48.68
17 +supply_chain,169,119,70.41
18 +automation,114,67,58.77
19 +energy_transition,107,81,75.7
20 +data_center,105,91,86.67
21 +ai_initiative,84,61,72.62
22 +cloud_migration,83,36,43.37
23
Menu

Theme