E (exhibits): make_tables.py rewritten — every table a self-contained float (caption, label, threeparttable notes, generated-by comment), 13 new Stage D exhibits (ledger calls, outage, grounding, spec curve, focus, cohort OLS, financing class, 8-K proxy, universe artefacts, time-series cohort, rules baseline, tokens, over-merge), Tables 1-9/12 rebuilt (ledger vs stored, CI column, 100.1 share, longtable), 8 figures to one design system (Okabe-Ito, markers, zero-based axes, integer ticks, cohort series, CIs); 830 \SPID macros incl. the 365 requested by the writing stage, computed from results/ (numbers_pending.tex retired); half-up rounding; render-and-inspect audit (quality_control/_FIRC-0001_*_audit.csv); README exhibit map (EDIT-21..23, ADVE-16, AI_C-16, AI_C-17, LITE-10, LITE-12, ECON-18, THEO-18, EDIT-05, ADVE-06, DATA-04, ECON-13, EDIT-14, ADVE-13, ECON-14, THEO-15, DATA-15, engine audit)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
60 changed files +6,212 −1,177
modified
README.md
+30 −24
@@ -31,28 +31,34 @@ python3 -I -m pytest -q tests # checks only | ||
| 31 | 31 | |
| 32 | 32 | ## Program-to-exhibit map |
| 33 | 33 | |
| 34 | −| exhibit | generated file | script | inputs | | |
| 34 | +Every table is a self-contained float written by `make_tables.py` to `paper/tables/<name>.tex` (caption, label, `threeparttable` notes, generated-by comment); every figure is a vector PDF plus a float wrapper `paper/figures/<name>.tex`. The prose files only `\input` them. Labels are `tab:<name without tab_>` and `fig:<name without fig_>`. | |
| 35 | + | |
| 36 | +| exhibit (label) | generated file | script | inputs | | |
| 35 | 37 | |---|---|---|---| |
| 36 | −| Table 1 universe reconciliation | `paper/tables/tab_reconciliation.tex` | `make_tables.py` | `stats.json:universe`, `documented_inputs.json:iwv_equity_lines_reported` | | |
| 37 | −| Table 2 filings by form | `tab_filings.tex` | `make_tables.py` | `filings_by_form.csv`, `parse_status.csv`, `stats.json` | | |
| 38 | −| Table 3 sections and ledger (+ note) | `tab_sections.tex`, `tab_sections_note.tex` | `make_tables.py` | `sections_by_form.csv`, `ledger_by_form.csv`, `mentions_by_form.csv`, `results/ledger/table3_ledger_vs_stored.csv`, `results/ledger/ledger_collisions.csv` | | |
| 39 | −| Table 4 items in scope | `tab_items.tex` | `make_tables.py` | `ledger_10k_items.csv`, `ledger_10q_items.csv`, `results/ledger/gate_pass_by_form_item.csv` | | |
| 40 | −| Table 5 projects by type (+ note) | `tab_types.tex`, `tab_types_note.tex` | `make_tables.py` | `projects_by_type.csv`, `projects_by_type_ci.csv` (N13), `results/resolver/overmerge_by_type.csv`, `amount_dist.csv` | | |
| 41 | −| Table 6 by sector | `tab_sectors.tex` | `make_tables.py` | `projects_by_sector.csv`, `companies_by_sector.csv` | | |
| 42 | −| Table 7 status / mentions / span | `tab_status.tex` | `make_tables.py` | `projects_by_status.csv`, `mentions_per_project.csv`, `duration.csv` | | |
| 43 | −| Table 8 amounts and projects per issuer (+ note) | `tab_amounts.tex`, `tab_amounts_note.tex` | `make_tables.py` | `amount_dist.csv`, `projects_per_issuer.csv`, `stats.json:amount_*` | | |
| 44 | −| Table 9 provenance example | `tab_provenance.tex` | `make_tables.py` | `example_provenance.csv`, `documented_inputs.json:snippet_chars` | | |
| 45 | −| Table 12 data-model audit (longtable) | `tab_datamodel.tex` | `make_tables.py` | `data/datamodel_audit.csv` | | |
| 46 | −| Tables 14–17 (appendix) | `tab_coverage_year.tex`, `tab_top_issuers.tex`, `tab_confidence.tex`, `tab_graph.tex` | `make_tables.py` | `issuers_by_year.csv`, `filings_by_year_form.csv`, `mentions_by_year.csv`, `projects_by_first_seen_year.csv`, `top_issuers.csv`, `confidence_dist.csv`, `kg.csv` | | |
| 47 | −| Appendix A taxonomy | `tab_taxonomy.tex` | `make_tables.py` | `code/audit/spid_snapshot/taxonomy.py` | | |
| 48 | −| Appendix B prompt and gate regex | `prompt_verbatim.tex`, `gate_regex.tex` | `make_tables.py` | `code/audit/spid_snapshot/llm.py`, `rules.py` (read with `ast`, never retyped) | | |
| 49 | −| Stage D tables (when `results/` is present) | `tab_spec_curve.tex`, `tab_top_name_tokens.tex`, `tab_overmerge.tex`, `tab_june_october.tex`, `tab_table3_calls.tex`, `tab_grounding.tex`, `tab_focus.tex`, `tab_cohort.tex`, `tab_fp_classes.tex`, `tab_timeseries_cohort.tex`, `tab_benchmark_8k.tex`, `tab_rules_agreement.tex` | `make_tables.py` (generic CSV → tabular) | `results/<package>/*.csv` from `code/audit/a*.py` | | |
| 50 | −| Figure 1 coverage (integer year ticks) | `paper/figures/fig_coverage.pdf` | `make_tables.py` | `issuers_by_year.csv` | | |
| 51 | −| Figure 3 projects by type | `fig_types.pdf` | `make_tables.py` | `projects_by_type.csv` | | |
| 52 | −| Figure 4 confidence | `fig_confidence.pdf` | `make_tables.py` | `confidence_dist.csv` | | |
| 53 | −| Figure 5 mentions and new projects by year (y from 0; second panel per issuer; 2010 / 2026 shaded) | `fig_mentions_year.pdf` | `make_tables.py` | `mentions_by_year.csv`, `projects_by_first_seen_year.csv` | | |
| 54 | −| Figure 2 pipeline diagram | `fig_pipeline.pdf` | hand-drawn (TikZ/PDF, not generated) | — | | |
| 55 | −| inline numbers (`\SPID…`) | `paper/tables/numbers.tex`, `results/inline_numbers.json` | `make_tables.py` | all of the above; `results/**.json` (N1, N3, L5) | | |
| 56 | −| `data/*.csv`, `data/stats.json` | 29 CSV + 3 new (`ledger_collisions`, `cohort_by_run`, `calls_by_form`) + `projects_by_type_ci.csv` | `export_stats.py` (node, read-only) | `edgar_research.duckdb`, `spid.duckdb`, `data/metadata/*.json`, run logs | | |
| 57 | − | |
| 58 | −Figure numbers follow the order of `main.tex`; the `.png` copies under `paper/figures/` are not produced by any script and are kept only for the Word export (`code/tex2docx`). | |
| 38 | +| tab:reconciliation universe reconciliation + Russell coverage | `tab_reconciliation.tex` | `make_tables.py` | `stats.json:universe`, `documented_inputs.json`, `results/russell_coverage.json`, `results/universe/universe_artefacts.json` | | |
| 39 | +| tab:filings filings by form | `tab_filings.tex` | `make_tables.py` | `filings_by_form.csv`, `parse_status.csv`, `results/universe/filings_status_missing.csv` | | |
| 40 | +| tab:sections ledger vs stored, calls | `tab_sections.tex` | `make_tables.py` | `sections_by_form.csv`, `ledger_by_form.csv`, `mentions_by_form.csv`, `results/ledger/table3_ledger_vs_stored.csv`, `ledger_collisions.csv` | | |
| 41 | +| tab:ledger_calls rows / calls / productive by form x run | `tab_ledger_calls.tex` | `make_tables.py` | `results/ledger/gate_pass_by_form_run.csv`, `gate_pass_by_run.csv`, `gate_pass_totals.json` | | |
| 42 | +| tab:outage outage reconciliation | `tab_outage.tex` | `make_tables.py` | `results/ledger/log_summary.json`, `throughput.json`, `backfill_block.json`, `resume_batch1_vs_expected.csv` | | |
| 43 | +| tab:items items in scope (+ calls, shown share, financing share) | `tab_items.tex` | `make_tables.py` | `ledger_10k_items.csv`, `ledger_10q_items.csv`, `results/ledger/gate_pass_by_form_item.csv`, `results/focus/`, `results/fp_classes/` | | |
| 44 | +| tab:fp_classes financing-class mentions | `tab_fp_classes.tex` | `make_tables.py` | `results/fp_classes/*.csv`, `summary.json` | | |
| 45 | +| tab:focus focus-window coverage | `tab_focus.tex` | `make_tables.py` | `results/focus/focus_coverage_by_form_item.csv`, `_by_form.csv`, `stats_keys.json` | | |
| 46 | +| tab:types projects by category (+ CI, excl. financing, over-merge) | `tab_types.tex` | `make_tables.py` | `projects_by_type.csv`, `projects_by_type_ci.csv`, `results/fp_classes/table5_restated_excl_financing.csv`, `results/resolver/overmerge_by_type.csv` | | |
| 47 | +| tab:sectors by sector | `tab_sectors.tex` | `make_tables.py` | `projects_by_sector.csv`, `companies_by_sector.csv` | | |
| 48 | +| tab:cohort cohort x run, issuer-level OLS | `tab_cohort.tex` | `make_tables.py` | `results/runs/table6_cohort.csv`, `table6_cohort_regression.json` | | |
| 49 | +| tab:status status / mentions / span | `tab_status.tex` | `make_tables.py` | `projects_by_status.csv`, `mentions_per_project.csv`, `duration.csv`, `results/resolver/ties_idempotence.json` | | |
| 50 | +| tab:amounts amounts and projects per issuer | `tab_amounts.tex` | `make_tables.py` | `amount_dist.csv`, `projects_per_issuer.csv`, `stats.json:amount_*`, `results/grounding/amount_tail.json` | | |
| 51 | +| tab:provenance provenance example | `tab_provenance.tex` | `make_tables.py` | `example_provenance.csv`, `documented_inputs.json:snippet_chars`, `results/resolver/composition.json` | | |
| 52 | +| tab:spec_curve specification curve of the project count | `tab_spec_curve.tex` | `make_tables.py` | `results/resolver/spec_curve.csv`, `composition.json`, `ties_idempotence.json` | | |
| 53 | +| tab:grounding mechanical grounding | `tab_grounding.tex` | `make_tables.py` | `results/grounding/grounding_by_group.csv`, `grounding_element_level.csv`, `grounding_all_structured.csv`, `fallback_bounds.json` | | |
| 54 | +| tab:benchmark_8k 8-K item-code consistency | `tab_benchmark_8k.tex` | `make_tables.py` | `results/benchmark_8k/item_vs_type.csv`, `summary.json` | | |
| 55 | +| tab:rules_agreement rules vs LLM, focus recall bound | `tab_rules_agreement.tex` | `make_tables.py` | `results/rules/agreement_by_form.csv`, `agreement_overall.csv`, `focus_recall_loss.csv` | | |
| 56 | +| tab:datamodel data-model audit (longtable, no float) | `tab_datamodel.tex` | `make_tables.py` | `data/datamodel_audit.csv` | | |
| 57 | +| tab:taxonomy, Appendix B prompt and gate regex | `tab_taxonomy.tex`, `prompt_verbatim.tex`, `gate_regex.tex` | `make_tables.py` | `code/audit/spid_snapshot/{taxonomy,llm,rules}.py` (read with `ast`, never retyped) | | |
| 58 | +| tab:june_october, tab:universe_artefacts, tab:coverage_year, tab:timeseries_cohort, tab:top_issuers, tab:confidence, tab:graph, tab:top_name_tokens, tab:overmerge (appendix) | `tab_<name>.tex` | `make_tables.py` | `results/resolver/`, `results/universe/`, `results/timeseries/`, `data/*.csv` | | |
| 59 | +| fig:coverage, fig:types, fig:confidence, fig:mentions_year, fig:grounding, fig:spec_curve, fig:focus | `fig_<name>.pdf` + `.png` + `.tex` float | `make_tables.py` (Okabe-Ito palette, markers + line styles, 9 pt serif, width = textwidth) | `data/*.csv`, `results/timeseries/`, `results/grounding/`, `results/resolver/`, `results/focus/` | | |
| 60 | +| fig:pipeline pipeline diagram | TikZ in `paper/sections/methodology.tex` | hand-drawn (not generated) | counts via `\SPID` macros | | |
| 61 | +| inline numbers (`\SPID…`) | `paper/tables/numbers.tex`, `results/inline_numbers.json` | `make_tables.py` | all of the above; `results/**.json` | | |
| 62 | +| `data/*.csv`, `data/stats.json` | 29 CSV + `ledger_collisions`, `cohort_by_run`, `calls_by_form`, `projects_by_type_ci` | `export_stats.py` (node, read-only; `IS DISTINCT FROM` amount_raw check, October wall-clock from the first October flush, deterministic ORDER BY, spill directory outside the repo) | `edgar_research.duckdb`, `spid.duckdb`, `data/metadata/*.json`, run logs | | |
| 63 | + | |
| 64 | +Exhibit numbers follow the order of `main.tex`. The `.png` copies under `paper/figures/` are written by `make_tables.py` at `documented_inputs.json:png_dpi` for the Word export (`code/tex2docx`). The render-and-inspect audit of every exhibit is recorded in `UQO-WP-REVIEW/quality_control/_FIRC-0001_{table,figure}_audit.csv`. | |
modified
code/make_tables.py
+1541 −273
Large diff (2,145 lines) is not loaded by default to keep the page fast.Load diff
modified
data/datamodel_audit.csv
+1 −1
Large diff (8 lines) is not loaded by default to keep the page fast.Load diff
modified
data/documented_inputs.json
+95 −0
Large diff (101 lines) is not loaded by default to keep the page fast.Load diff
modified
paper/figures/fig_confidence.pdf
+0 −0
Binary file not shown.
modified
paper/figures/fig_confidence.png
+0 −0
Binary file not shown.
added
paper/figures/fig_confidence.tex
+6 −0
Large diff (6 lines) is not loaded by default to keep the page fast.Load diff
modified
paper/figures/fig_coverage.pdf
+0 −0
Binary file not shown.
modified
paper/figures/fig_coverage.png
+0 −0
Binary file not shown.
added
paper/figures/fig_coverage.tex
+6 −0
Large diff (6 lines) is not loaded by default to keep the page fast.Load diff
added
paper/figures/fig_focus.pdf
+0 −0
Binary file not shown.
added
paper/figures/fig_focus.png
+0 −0
Binary file not shown.
added
paper/figures/fig_focus.tex
+6 −0
Large diff (6 lines) is not loaded by default to keep the page fast.Load diff
added
paper/figures/fig_grounding.pdf
+0 −0
Binary file not shown.
added
paper/figures/fig_grounding.png
+0 −0
Binary file not shown.
added
paper/figures/fig_grounding.tex
+6 −0
Large diff (6 lines) is not loaded by default to keep the page fast.Load diff
modified
paper/figures/fig_mentions_year.pdf
+0 −0
Binary file not shown.
modified
paper/figures/fig_mentions_year.png
+0 −0
Binary file not shown.
added
paper/figures/fig_mentions_year.tex
+6 −0
Large diff (6 lines) is not loaded by default to keep the page fast.Load diff
added
paper/figures/fig_spec_curve.pdf
+0 −0
Binary file not shown.
added
paper/figures/fig_spec_curve.png
+0 −0
Binary file not shown.
added
paper/figures/fig_spec_curve.tex
+6 −0
Large diff (6 lines) is not loaded by default to keep the page fast.Load diff
modified
paper/figures/fig_types.pdf
+0 −0
Binary file not shown.
modified
paper/figures/fig_types.png
+0 −0
Binary file not shown.
added
paper/figures/fig_types.tex
+6 −0
Large diff (6 lines) is not loaded by default to keep the page fast.Load diff
modified
paper/main.tex
+0 −2
Large diff (14 lines) is not loaded by default to keep the page fast.Load diff
deleted
paper/sections/numbers_pending.tex
+0 −465
Large diff (465 lines) is not loaded by default to keep the page fast.Load diff
modified
paper/tables/gate_regex.tex
+3 −2
Large diff (8 lines) is not loaded by default to keep the page fast.Load diff
modified
paper/tables/numbers.tex
+636 −13
Large diff (778 lines) is not loaded by default to keep the page fast.Load diff
modified
paper/tables/prompt_verbatim.tex
+3 −2
Large diff (11 lines) is not loaded by default to keep the page fast.Load diff
modified
paper/tables/tab_amounts.tex
+10 −0
Large diff (16 lines) is not loaded by default to keep the page fast.Load diff
added
paper/tables/tab_benchmark_8k.tex
+30 −0
Large diff (30 lines) is not loaded by default to keep the page fast.Load diff
added
paper/tables/tab_cohort.tex
+31 −0
Large diff (31 lines) is not loaded by default to keep the page fast.Load diff
modified
paper/tables/tab_confidence.tex
+20 −8
Large diff (32 lines) is not loaded by default to keep the page fast.Load diff
modified
paper/tables/tab_coverage_year.tex
+14 −1
Large diff (23 lines) is not loaded by default to keep the page fast.Load diff
modified
paper/tables/tab_datamodel.tex
+18 −10
Large diff (42 lines) is not loaded by default to keep the page fast.Load diff
modified
paper/tables/tab_filings.tex
+16 −6
Large diff (27 lines) is not loaded by default to keep the page fast.Load diff
added
paper/tables/tab_focus.tex
+40 −0
Large diff (40 lines) is not loaded by default to keep the page fast.Load diff
modified
paper/tables/tab_fp_classes.tex
+33 −63
Large diff (100 lines) is not loaded by default to keep the page fast.Load diff
modified
paper/tables/tab_graph.tex
+13 −0
Large diff (21 lines) is not loaded by default to keep the page fast.Load diff
modified
paper/tables/tab_grounding.tex
+40 −63
Large diff (107 lines) is not loaded by default to keep the page fast.Load diff
modified
paper/tables/tab_items.tex
+31 −16
Large diff (52 lines) is not loaded by default to keep the page fast.Load diff
modified
paper/tables/tab_june_october.tex
+21 −11
Large diff (36 lines) is not loaded by default to keep the page fast.Load diff
added
paper/tables/tab_ledger_calls.tex
+29 −0
Large diff (29 lines) is not loaded by default to keep the page fast.Load diff
added
paper/tables/tab_outage.tex
+37 −0
Large diff (37 lines) is not loaded by default to keep the page fast.Load diff
modified
paper/tables/tab_overmerge.tex
+36 −23
Large diff (63 lines) is not loaded by default to keep the page fast.Load diff
modified
paper/tables/tab_provenance.tex
+15 −2
Large diff (24 lines) is not loaded by default to keep the page fast.Load diff
modified
paper/tables/tab_reconciliation.tex
+14 −1
Large diff (26 lines) is not loaded by default to keep the page fast.Load diff
added
paper/tables/tab_rules_agreement.tex
+32 −0
Large diff (32 lines) is not loaded by default to keep the page fast.Load diff
modified
paper/tables/tab_sections.tex
+14 −1
Large diff (23 lines) is not loaded by default to keep the page fast.Load diff
modified
paper/tables/tab_sectors.tex
+13 −1
Large diff (24 lines) is not loaded by default to keep the page fast.Load diff
modified
paper/tables/tab_spec_curve.tex
+24 −47
Large diff (75 lines) is not loaded by default to keep the page fast.Load diff
modified
paper/tables/tab_status.tex
+13 −1
Large diff (22 lines) is not loaded by default to keep the page fast.Load diff
modified
paper/tables/tab_taxonomy.tex
+10 −0
Large diff (16 lines) is not loaded by default to keep the page fast.Load diff
modified
paper/tables/tab_timeseries_cohort.tex
+34 −36
Large diff (74 lines) is not loaded by default to keep the page fast.Load diff
modified
paper/tables/tab_top_issuers.tex
+12 −2
Large diff (25 lines) is not loaded by default to keep the page fast.Load diff
modified
paper/tables/tab_top_name_tokens.tex
+26 −22
Large diff (53 lines) is not loaded by default to keep the page fast.Load diff
modified
paper/tables/tab_types.tex
+37 −24
Large diff (66 lines) is not loaded by default to keep the page fast.Load diff
added
paper/tables/tab_universe_artefacts.tex
+26 −0
Large diff (26 lines) is not loaded by default to keep the page fast.Load diff
modified
results/inline_numbers.json
+3172 −57
Large diff (3,426 lines) is not loaded by default to keep the page fast.Load diff