finpanel 0.1.0a2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (326) hide show
  1. finpanel-0.1.0a2/.gitattributes +4 -0
  2. finpanel-0.1.0a2/CHANGELOG.md +40 -0
  3. finpanel-0.1.0a2/LICENSE +21 -0
  4. finpanel-0.1.0a2/MANIFEST.in +16 -0
  5. finpanel-0.1.0a2/PKG-INFO +195 -0
  6. finpanel-0.1.0a2/README.md +168 -0
  7. finpanel-0.1.0a2/THIRD_PARTY_NOTICES.md +50 -0
  8. finpanel-0.1.0a2/docs/api-stability.md +103 -0
  9. finpanel-0.1.0a2/docs/broad-benchmark-receipt.json +650 -0
  10. finpanel-0.1.0a2/docs/broad-classifier-regression.json +9 -0
  11. finpanel-0.1.0a2/docs/broad-evidence-manifest.json +5085 -0
  12. finpanel-0.1.0a2/docs/broad-golden-validation.json +3897 -0
  13. finpanel-0.1.0a2/docs/broad-performance.json +590 -0
  14. finpanel-0.1.0a2/docs/broad-validation.json +74 -0
  15. finpanel-0.1.0a2/docs/broad-validation.md +261 -0
  16. finpanel-0.1.0a2/docs/canonical-validation.json +15 -0
  17. finpanel-0.1.0a2/docs/derived-quarter-validation.json +20 -0
  18. finpanel-0.1.0a2/docs/historical-audit.md +87 -0
  19. finpanel-0.1.0a2/docs/panel-validation.json +321 -0
  20. finpanel-0.1.0a2/docs/publishing.md +137 -0
  21. finpanel-0.1.0a2/docs/release-a2-notes.md +26 -0
  22. finpanel-0.1.0a2/docs/release-candidate-gate.md +93 -0
  23. finpanel-0.1.0a2/docs/release-checklist.md +52 -0
  24. finpanel-0.1.0a2/docs/release-gate-ci.json +42 -0
  25. finpanel-0.1.0a2/docs/release-golden-inventory.json +39 -0
  26. finpanel-0.1.0a2/docs/release-notes-draft.md +33 -0
  27. finpanel-0.1.0a2/docs/release-resume-verification.json +18 -0
  28. finpanel-0.1.0a2/docs/release-scale-validation.json +5157 -0
  29. finpanel-0.1.0a2/docs/release-status.md +69 -0
  30. finpanel-0.1.0a2/docs/release-temporal-audit.json +1611 -0
  31. finpanel-0.1.0a2/docs/release-universe-audit.json +1007 -0
  32. finpanel-0.1.0a2/docs/release-validation.md +203 -0
  33. finpanel-0.1.0a2/docs/research-panels.md +230 -0
  34. finpanel-0.1.0a2/docs/researcher-guide.md +176 -0
  35. finpanel-0.1.0a2/docs/resumable-validation.md +49 -0
  36. finpanel-0.1.0a2/docs/snapshot-validation.json +14 -0
  37. finpanel-0.1.0a2/docs/technical-reference.md +1674 -0
  38. finpanel-0.1.0a2/docs/wp7-completion-report.md +172 -0
  39. finpanel-0.1.0a2/docs/xbrl-evidence-validation.json +338 -0
  40. finpanel-0.1.0a2/examples/audit_release_temporal.py +96 -0
  41. finpanel-0.1.0a2/examples/build_broad_panel.py +45 -0
  42. finpanel-0.1.0a2/examples/build_research_panel.py +234 -0
  43. finpanel-0.1.0a2/examples/freeze_filing_header.py +53 -0
  44. finpanel-0.1.0a2/examples/freeze_history_snapshots.py +67 -0
  45. finpanel-0.1.0a2/examples/freeze_sec_snapshots.py +55 -0
  46. finpanel-0.1.0a2/examples/inspect_company.py +12 -0
  47. finpanel-0.1.0a2/examples/inspect_provenance.py +54 -0
  48. finpanel-0.1.0a2/examples/inspect_timeline.py +35 -0
  49. finpanel-0.1.0a2/examples/summarize_broad_runs.py +213 -0
  50. finpanel-0.1.0a2/examples/validate_canonical.py +158 -0
  51. finpanel-0.1.0a2/examples/validate_derived_quarters.py +253 -0
  52. finpanel-0.1.0a2/examples/validate_snapshots.py +190 -0
  53. finpanel-0.1.0a2/examples/validate_xbrl.py +142 -0
  54. finpanel-0.1.0a2/pyproject.toml +48 -0
  55. finpanel-0.1.0a2/scripts/validate_install.py +91 -0
  56. finpanel-0.1.0a2/setup.cfg +4 -0
  57. finpanel-0.1.0a2/src/finpanel/__init__.py +3 -0
  58. finpanel-0.1.0a2/src/finpanel/_reuse.py +52 -0
  59. finpanel-0.1.0a2/src/finpanel/asof.py +321 -0
  60. finpanel-0.1.0a2/src/finpanel/availability.py +228 -0
  61. finpanel-0.1.0a2/src/finpanel/cache/__init__.py +3 -0
  62. finpanel-0.1.0a2/src/finpanel/cache/file.py +88 -0
  63. finpanel-0.1.0a2/src/finpanel/cli.py +745 -0
  64. finpanel-0.1.0a2/src/finpanel/errors.py +29 -0
  65. finpanel-0.1.0a2/src/finpanel/example.py +70 -0
  66. finpanel-0.1.0a2/src/finpanel/example_data/0000012659_companyfacts_06e056b0473f.gz +0 -0
  67. finpanel-0.1.0a2/src/finpanel/example_data/0000012659_historical_submissions_19f80cc024c7.gz +0 -0
  68. finpanel-0.1.0a2/src/finpanel/example_data/0000012659_submissions_b19e8cc45986.gz +0 -0
  69. finpanel-0.1.0a2/src/finpanel/example_data/manifest.json +84 -0
  70. finpanel-0.1.0a2/src/finpanel/facts.py +234 -0
  71. finpanel-0.1.0a2/src/finpanel/filings.py +331 -0
  72. finpanel-0.1.0a2/src/finpanel/metrics/__init__.py +40 -0
  73. finpanel-0.1.0a2/src/finpanel/metrics/derivation.py +343 -0
  74. finpanel-0.1.0a2/src/finpanel/metrics/derivation_models.py +99 -0
  75. finpanel-0.1.0a2/src/finpanel/metrics/engine.py +267 -0
  76. finpanel-0.1.0a2/src/finpanel/metrics/quarters.py +247 -0
  77. finpanel-0.1.0a2/src/finpanel/metrics/registry.py +155 -0
  78. finpanel-0.1.0a2/src/finpanel/metrics/resolver.py +290 -0
  79. finpanel-0.1.0a2/src/finpanel/models/__init__.py +5 -0
  80. finpanel-0.1.0a2/src/finpanel/models/asof.py +63 -0
  81. finpanel-0.1.0a2/src/finpanel/models/context.py +15 -0
  82. finpanel-0.1.0a2/src/finpanel/models/evidence.py +42 -0
  83. finpanel-0.1.0a2/src/finpanel/models/fact.py +66 -0
  84. finpanel-0.1.0a2/src/finpanel/models/filing.py +20 -0
  85. finpanel-0.1.0a2/src/finpanel/models/period.py +72 -0
  86. finpanel-0.1.0a2/src/finpanel/models/source.py +68 -0
  87. finpanel-0.1.0a2/src/finpanel/models/timeline.py +85 -0
  88. finpanel-0.1.0a2/src/finpanel/panel/__init__.py +18 -0
  89. finpanel-0.1.0a2/src/finpanel/panel/cli.py +45 -0
  90. finpanel-0.1.0a2/src/finpanel/panel/engine.py +580 -0
  91. finpanel-0.1.0a2/src/finpanel/panel/export.py +253 -0
  92. finpanel-0.1.0a2/src/finpanel/panel/models.py +173 -0
  93. finpanel-0.1.0a2/src/finpanel/periods.py +447 -0
  94. finpanel-0.1.0a2/src/finpanel/revisions.py +209 -0
  95. finpanel-0.1.0a2/src/finpanel/sec/__init__.py +5 -0
  96. finpanel-0.1.0a2/src/finpanel/sec/client.py +253 -0
  97. finpanel-0.1.0a2/src/finpanel/sec/common.py +58 -0
  98. finpanel-0.1.0a2/src/finpanel/sec/companyfacts.py +89 -0
  99. finpanel-0.1.0a2/src/finpanel/sec/headers.py +150 -0
  100. finpanel-0.1.0a2/src/finpanel/sec/submissions.py +160 -0
  101. finpanel-0.1.0a2/src/finpanel/serialization.py +51 -0
  102. finpanel-0.1.0a2/src/finpanel/snapshots/__init__.py +25 -0
  103. finpanel-0.1.0a2/src/finpanel/snapshots/cli.py +107 -0
  104. finpanel-0.1.0a2/src/finpanel/snapshots/pipeline.py +367 -0
  105. finpanel-0.1.0a2/src/finpanel/snapshots/store.py +378 -0
  106. finpanel-0.1.0a2/src/finpanel/validation/__init__.py +6 -0
  107. finpanel-0.1.0a2/src/finpanel/validation/acquisition.py +199 -0
  108. finpanel-0.1.0a2/src/finpanel/validation/checkpoints.py +132 -0
  109. finpanel-0.1.0a2/src/finpanel/validation/cli.py +96 -0
  110. finpanel-0.1.0a2/src/finpanel/validation/fixtures.py +46 -0
  111. finpanel-0.1.0a2/src/finpanel/validation/goldens.py +166 -0
  112. finpanel-0.1.0a2/src/finpanel/validation/historical.py +171 -0
  113. finpanel-0.1.0a2/src/finpanel/validation/invariants.py +103 -0
  114. finpanel-0.1.0a2/src/finpanel/validation/release-universe.json +1976 -0
  115. finpanel-0.1.0a2/src/finpanel/validation/runner.py +482 -0
  116. finpanel-0.1.0a2/src/finpanel/validation/taxonomy.py +81 -0
  117. finpanel-0.1.0a2/src/finpanel/validation/universe.json +675 -0
  118. finpanel-0.1.0a2/src/finpanel/validation/universe.py +49 -0
  119. finpanel-0.1.0a2/src/finpanel/xbrl/__init__.py +41 -0
  120. finpanel-0.1.0a2/src/finpanel/xbrl/cli.py +145 -0
  121. finpanel-0.1.0a2/src/finpanel/xbrl/discovery.py +164 -0
  122. finpanel-0.1.0a2/src/finpanel/xbrl/integration.py +157 -0
  123. finpanel-0.1.0a2/src/finpanel/xbrl/models.py +82 -0
  124. finpanel-0.1.0a2/src/finpanel/xbrl/parser.py +320 -0
  125. finpanel-0.1.0a2/src/finpanel/xbrl/verification.py +238 -0
  126. finpanel-0.1.0a2/src/finpanel.egg-info/PKG-INFO +195 -0
  127. finpanel-0.1.0a2/src/finpanel.egg-info/SOURCES.txt +324 -0
  128. finpanel-0.1.0a2/src/finpanel.egg-info/dependency_links.txt +1 -0
  129. finpanel-0.1.0a2/src/finpanel.egg-info/entry_points.txt +2 -0
  130. finpanel-0.1.0a2/src/finpanel.egg-info/requires.txt +10 -0
  131. finpanel-0.1.0a2/src/finpanel.egg-info/top_level.txt +1 -0
  132. finpanel-0.1.0a2/tests/conftest.py +82 -0
  133. finpanel-0.1.0a2/tests/fixtures/aapl_companyfacts.json +93 -0
  134. finpanel-0.1.0a2/tests/fixtures/aapl_submissions.json +53 -0
  135. finpanel-0.1.0a2/tests/fixtures/broad/0000012927_companyfacts_0c63f1ae7cc1.gz +0 -0
  136. finpanel-0.1.0a2/tests/fixtures/broad/0000012927_filing_directory_81d319342528.gz +0 -0
  137. finpanel-0.1.0a2/tests/fixtures/broad/0000012927_filing_directory_c4405d92b0ff.gz +0 -0
  138. finpanel-0.1.0a2/tests/fixtures/broad/0000012927_historical_submissions_c203898f0665.gz +0 -0
  139. finpanel-0.1.0a2/tests/fixtures/broad/0000012927_historical_submissions_c30620b96c29.gz +0 -0
  140. finpanel-0.1.0a2/tests/fixtures/broad/0000012927_submissions_6772e8d08a03.gz +0 -0
  141. finpanel-0.1.0a2/tests/fixtures/broad/0000012927_xbrl_instance_2887397ac7ec.gz +0 -0
  142. finpanel-0.1.0a2/tests/fixtures/broad/0000027419_companyfacts_eb15a2cd524e.gz +0 -0
  143. finpanel-0.1.0a2/tests/fixtures/broad/0000027419_filing_directory_ab627a0c36c6.gz +0 -0
  144. finpanel-0.1.0a2/tests/fixtures/broad/0000027419_filing_directory_ccad5045562e.gz +0 -0
  145. finpanel-0.1.0a2/tests/fixtures/broad/0000027419_historical_submissions_3c7e5adca75c.gz +0 -0
  146. finpanel-0.1.0a2/tests/fixtures/broad/0000027419_submissions_3d133aa9e678.gz +0 -0
  147. finpanel-0.1.0a2/tests/fixtures/broad/0000027419_xbrl_instance_0dd83275bbe1.gz +0 -0
  148. finpanel-0.1.0a2/tests/fixtures/broad/0000034088_companyfacts_9b95535419e5.gz +0 -0
  149. finpanel-0.1.0a2/tests/fixtures/broad/0000034088_filing_directory_5c4e431bf02f.gz +0 -0
  150. finpanel-0.1.0a2/tests/fixtures/broad/0000034088_filing_directory_cab8c07c1936.gz +0 -0
  151. finpanel-0.1.0a2/tests/fixtures/broad/0000034088_historical_submissions_14a22c25d87b.gz +0 -0
  152. finpanel-0.1.0a2/tests/fixtures/broad/0000034088_historical_submissions_e806a24ea2b1.gz +0 -0
  153. finpanel-0.1.0a2/tests/fixtures/broad/0000034088_submissions_c86c3d1c16e5.gz +0 -0
  154. finpanel-0.1.0a2/tests/fixtures/broad/0000034088_xbrl_instance_7213f85b0da5.gz +0 -0
  155. finpanel-0.1.0a2/tests/fixtures/broad/0000050863_companyfacts_70056711b8b0.gz +0 -0
  156. finpanel-0.1.0a2/tests/fixtures/broad/0000050863_filing_directory_93b9fd63664d.gz +0 -0
  157. finpanel-0.1.0a2/tests/fixtures/broad/0000050863_filing_directory_ea3b1d755f44.gz +0 -0
  158. finpanel-0.1.0a2/tests/fixtures/broad/0000050863_historical_submissions_78c7faef4a09.gz +0 -0
  159. finpanel-0.1.0a2/tests/fixtures/broad/0000050863_historical_submissions_fbd1edb817f0.gz +0 -0
  160. finpanel-0.1.0a2/tests/fixtures/broad/0000050863_submissions_f04f1a2215ca.gz +0 -0
  161. finpanel-0.1.0a2/tests/fixtures/broad/0000050863_xbrl_instance_b77e5ce22889.gz +0 -0
  162. finpanel-0.1.0a2/tests/fixtures/broad/0000078003_companyfacts_bd072131f9dc.gz +0 -0
  163. finpanel-0.1.0a2/tests/fixtures/broad/0000078003_filing_directory_246532809708.gz +0 -0
  164. finpanel-0.1.0a2/tests/fixtures/broad/0000078003_filing_directory_76c6384825ac.gz +0 -0
  165. finpanel-0.1.0a2/tests/fixtures/broad/0000078003_historical_submissions_130d25baac4e.gz +0 -0
  166. finpanel-0.1.0a2/tests/fixtures/broad/0000078003_historical_submissions_3f999f06ad4a.gz +0 -0
  167. finpanel-0.1.0a2/tests/fixtures/broad/0000078003_historical_submissions_503225981fca.gz +0 -0
  168. finpanel-0.1.0a2/tests/fixtures/broad/0000078003_submissions_f91e9e227323.gz +0 -0
  169. finpanel-0.1.0a2/tests/fixtures/broad/0000078003_xbrl_instance_6df3a97b0eb2.gz +0 -0
  170. finpanel-0.1.0a2/tests/fixtures/broad/0000320187_companyfacts_d7aeceae21e6.gz +0 -0
  171. finpanel-0.1.0a2/tests/fixtures/broad/0000320187_filing_directory_9b8660811e2c.gz +0 -0
  172. finpanel-0.1.0a2/tests/fixtures/broad/0000320187_filing_directory_cde80cc31dfa.gz +0 -0
  173. finpanel-0.1.0a2/tests/fixtures/broad/0000320187_historical_submissions_20eb7fac33c0.gz +0 -0
  174. finpanel-0.1.0a2/tests/fixtures/broad/0000320187_historical_submissions_350846c62298.gz +0 -0
  175. finpanel-0.1.0a2/tests/fixtures/broad/0000320187_submissions_f2aed6a3da2b.gz +0 -0
  176. finpanel-0.1.0a2/tests/fixtures/broad/0000320187_xbrl_instance_7f2089977244.gz +0 -0
  177. finpanel-0.1.0a2/tests/fixtures/broad/0000796343_companyfacts_86a5689aa9aa.gz +0 -0
  178. finpanel-0.1.0a2/tests/fixtures/broad/0000796343_filing_directory_5dbfba283fc9.gz +0 -0
  179. finpanel-0.1.0a2/tests/fixtures/broad/0000796343_filing_directory_f932c1268837.gz +0 -0
  180. finpanel-0.1.0a2/tests/fixtures/broad/0000796343_historical_submissions_569d7d5d3302.gz +0 -0
  181. finpanel-0.1.0a2/tests/fixtures/broad/0000796343_submissions_804c48e9b37e.gz +0 -0
  182. finpanel-0.1.0a2/tests/fixtures/broad/0000796343_xbrl_instance_f409e7b81cbd.gz +0 -0
  183. finpanel-0.1.0a2/tests/fixtures/broad/0000909832_companyfacts_b675ced201b2.gz +0 -0
  184. finpanel-0.1.0a2/tests/fixtures/broad/0000909832_filing_directory_a7dbbd2210b1.gz +0 -0
  185. finpanel-0.1.0a2/tests/fixtures/broad/0000909832_filing_directory_f94858e3c7fc.gz +0 -0
  186. finpanel-0.1.0a2/tests/fixtures/broad/0000909832_historical_submissions_757da598a805.gz +0 -0
  187. finpanel-0.1.0a2/tests/fixtures/broad/0000909832_submissions_82217bd906db.gz +0 -0
  188. finpanel-0.1.0a2/tests/fixtures/broad/0000909832_xbrl_instance_08fc6b7c58a6.gz +0 -0
  189. finpanel-0.1.0a2/tests/fixtures/broad/0001018724_companyfacts_7549fb68446e.gz +0 -0
  190. finpanel-0.1.0a2/tests/fixtures/broad/0001018724_filing_directory_12aec7b222c8.gz +0 -0
  191. finpanel-0.1.0a2/tests/fixtures/broad/0001018724_filing_directory_939f2fdd7015.gz +0 -0
  192. finpanel-0.1.0a2/tests/fixtures/broad/0001018724_historical_submissions_2826573f41f8.gz +0 -0
  193. finpanel-0.1.0a2/tests/fixtures/broad/0001018724_historical_submissions_4d75fbd7d19d.gz +0 -0
  194. finpanel-0.1.0a2/tests/fixtures/broad/0001018724_submissions_1f5bb6be4033.gz +0 -0
  195. finpanel-0.1.0a2/tests/fixtures/broad/0001018724_xbrl_instance_9027eeffc488.gz +0 -0
  196. finpanel-0.1.0a2/tests/fixtures/broad/0001090727_companyfacts_19a5c39708df.gz +0 -0
  197. finpanel-0.1.0a2/tests/fixtures/broad/0001090727_filing_directory_1b65ed8546ee.gz +0 -0
  198. finpanel-0.1.0a2/tests/fixtures/broad/0001090727_filing_directory_e7d9bfb64417.gz +0 -0
  199. finpanel-0.1.0a2/tests/fixtures/broad/0001090727_historical_submissions_a229b8aaa873.gz +0 -0
  200. finpanel-0.1.0a2/tests/fixtures/broad/0001090727_historical_submissions_abd94e2bb428.gz +0 -0
  201. finpanel-0.1.0a2/tests/fixtures/broad/0001090727_submissions_b5540a0075af.gz +0 -0
  202. finpanel-0.1.0a2/tests/fixtures/broad/0001090727_xbrl_instance_70d3a177a922.gz +0 -0
  203. finpanel-0.1.0a2/tests/fixtures/broad/0001326160_companyfacts_1e94bb53863e.gz +0 -0
  204. finpanel-0.1.0a2/tests/fixtures/broad/0001326160_filing_directory_8e35967b8122.gz +0 -0
  205. finpanel-0.1.0a2/tests/fixtures/broad/0001326160_filing_directory_b6ebe920a4c4.gz +0 -0
  206. finpanel-0.1.0a2/tests/fixtures/broad/0001326160_historical_submissions_c655de1cd114.gz +0 -0
  207. finpanel-0.1.0a2/tests/fixtures/broad/0001326160_historical_submissions_fd8fb5958ff5.gz +0 -0
  208. finpanel-0.1.0a2/tests/fixtures/broad/0001326160_submissions_a181db4d9d4e.gz +0 -0
  209. finpanel-0.1.0a2/tests/fixtures/broad/0001326160_xbrl_instance_c91b0a19ee55.gz +0 -0
  210. finpanel-0.1.0a2/tests/fixtures/broad/0001341439_companyfacts_65523545f040.gz +0 -0
  211. finpanel-0.1.0a2/tests/fixtures/broad/0001341439_filing_directory_84546e7617f2.gz +0 -0
  212. finpanel-0.1.0a2/tests/fixtures/broad/0001341439_filing_directory_d20fb54e1453.gz +0 -0
  213. finpanel-0.1.0a2/tests/fixtures/broad/0001341439_historical_submissions_73288c48255e.gz +0 -0
  214. finpanel-0.1.0a2/tests/fixtures/broad/0001341439_submissions_bed0ec89b0d2.gz +0 -0
  215. finpanel-0.1.0a2/tests/fixtures/broad/0001341439_xbrl_instance_4f8838f04c4c.gz +0 -0
  216. finpanel-0.1.0a2/tests/fixtures/broad/0001751788_companyfacts_ff212d1e276f.gz +0 -0
  217. finpanel-0.1.0a2/tests/fixtures/broad/0001751788_filing_directory_1b704ecae66c.gz +0 -0
  218. finpanel-0.1.0a2/tests/fixtures/broad/0001751788_filing_directory_50016b4813a5.gz +0 -0
  219. finpanel-0.1.0a2/tests/fixtures/broad/0001751788_submissions_7450bcf9768f.gz +0 -0
  220. finpanel-0.1.0a2/tests/fixtures/broad/0001751788_xbrl_instance_3e581b50fc00.gz +0 -0
  221. finpanel-0.1.0a2/tests/fixtures/broad/manifest.json +2402 -0
  222. finpanel-0.1.0a2/tests/fixtures/headers/0000320193-24-000123.hdr.sgml +47 -0
  223. finpanel-0.1.0a2/tests/fixtures/headers/manifest.json +15 -0
  224. finpanel-0.1.0a2/tests/fixtures/history/CIK0000320193-submissions-001.json +1 -0
  225. finpanel-0.1.0a2/tests/fixtures/history/manifest.json +18 -0
  226. finpanel-0.1.0a2/tests/fixtures/manifest.json +54 -0
  227. finpanel-0.1.0a2/tests/fixtures/msft_companyfacts.json +93 -0
  228. finpanel-0.1.0a2/tests/fixtures/msft_submissions.json +53 -0
  229. finpanel-0.1.0a2/tests/fixtures/nvda_companyfacts.json +93 -0
  230. finpanel-0.1.0a2/tests/fixtures/nvda_submissions.json +53 -0
  231. finpanel-0.1.0a2/tests/fixtures/release/0000012659_companyfacts_06e056b0473f.gz +0 -0
  232. finpanel-0.1.0a2/tests/fixtures/release/0000012659_filing_text_1edcd3bade44.gz +0 -0
  233. finpanel-0.1.0a2/tests/fixtures/release/0000012659_historical_submissions_19f80cc024c7.gz +0 -0
  234. finpanel-0.1.0a2/tests/fixtures/release/0000012659_submissions_b19e8cc45986.gz +0 -0
  235. finpanel-0.1.0a2/tests/fixtures/release/0000063276_companyfacts_b5b67c2c769d.gz +0 -0
  236. finpanel-0.1.0a2/tests/fixtures/release/0000063276_filing_text_39effbac53b7.gz +0 -0
  237. finpanel-0.1.0a2/tests/fixtures/release/0000063276_historical_submissions_ca44cf06e2c5.gz +0 -0
  238. finpanel-0.1.0a2/tests/fixtures/release/0000063276_submissions_6196a56fba14.gz +0 -0
  239. finpanel-0.1.0a2/tests/fixtures/release/0001637459_companyfacts_8fad66c16e53.gz +0 -0
  240. finpanel-0.1.0a2/tests/fixtures/release/0001637459_submissions_2f168e869f78.gz +0 -0
  241. finpanel-0.1.0a2/tests/fixtures/release/manifest.json +268 -0
  242. finpanel-0.1.0a2/tests/fixtures/sec/aapl_companyfacts.json +1 -0
  243. finpanel-0.1.0a2/tests/fixtures/sec/aapl_submissions.json +1 -0
  244. finpanel-0.1.0a2/tests/fixtures/sec/manifest.json +85 -0
  245. finpanel-0.1.0a2/tests/fixtures/sec/msft_companyfacts.json +1 -0
  246. finpanel-0.1.0a2/tests/fixtures/sec/msft_submissions.json +1 -0
  247. finpanel-0.1.0a2/tests/fixtures/sec/nvda_companyfacts.json +1 -0
  248. finpanel-0.1.0a2/tests/fixtures/sec/nvda_submissions.json +1 -0
  249. finpanel-0.1.0a2/tests/fixtures/sec/wmt_companyfacts.json +1 -0
  250. finpanel-0.1.0a2/tests/fixtures/sec/wmt_submissions.json +1 -0
  251. finpanel-0.1.0a2/tests/fixtures/wmt_companyfacts.json +93 -0
  252. finpanel-0.1.0a2/tests/fixtures/wmt_submissions.json +53 -0
  253. finpanel-0.1.0a2/tests/fixtures/xbrl/aapl-0000320193-24-000006-0000320193-24-000006-index.html +233 -0
  254. finpanel-0.1.0a2/tests/fixtures/xbrl/aapl-0000320193-24-000006-aapl-20231230_htm.xml +2123 -0
  255. finpanel-0.1.0a2/tests/fixtures/xbrl/aapl-0000320193-24-000006-index.json +1 -0
  256. finpanel-0.1.0a2/tests/fixtures/xbrl/aapl-0000320193-24-000069-0000320193-24-000069-index.html +233 -0
  257. finpanel-0.1.0a2/tests/fixtures/xbrl/aapl-0000320193-24-000069-aapl-20240330_htm.xml +2834 -0
  258. finpanel-0.1.0a2/tests/fixtures/xbrl/aapl-0000320193-24-000069-index.json +1 -0
  259. finpanel-0.1.0a2/tests/fixtures/xbrl/manifest.json +185 -0
  260. finpanel-0.1.0a2/tests/fixtures/xbrl/msft-0000950170-24-048288-0000950170-24-048288-index.html +212 -0
  261. finpanel-0.1.0a2/tests/fixtures/xbrl/msft-0000950170-24-048288-index.json +1 -0
  262. finpanel-0.1.0a2/tests/fixtures/xbrl/msft-0000950170-24-048288-msft-20240331_htm.xml +37616 -0
  263. finpanel-0.1.0a2/tests/fixtures/xbrl/nvda-0001045810-24-000264-0001045810-24-000264-index.html +254 -0
  264. finpanel-0.1.0a2/tests/fixtures/xbrl/nvda-0001045810-24-000264-index.json +1 -0
  265. finpanel-0.1.0a2/tests/fixtures/xbrl/nvda-0001045810-24-000264-nvda-20240728_htm.xml +4215 -0
  266. finpanel-0.1.0a2/tests/fixtures/xbrl/wmt-0000104169-24-000141-0000104169-24-000141-index.html +247 -0
  267. finpanel-0.1.0a2/tests/fixtures/xbrl/wmt-0000104169-24-000141-index.json +1 -0
  268. finpanel-0.1.0a2/tests/fixtures/xbrl/wmt-0000104169-24-000141-wmt-20240731_htm.xml +3872 -0
  269. finpanel-0.1.0a2/tests/golden/broad-edges.json +1076 -0
  270. finpanel-0.1.0a2/tests/golden/broad.json +5118 -0
  271. finpanel-0.1.0a2/tests/golden/canonical.json +826 -0
  272. finpanel-0.1.0a2/tests/golden/derived_quarters.json +1021 -0
  273. finpanel-0.1.0a2/tests/golden/release-calendar.json +565 -0
  274. finpanel-0.1.0a2/tests/golden/release-revisions.json +1481 -0
  275. finpanel-0.1.0a2/tests/golden/xbrl_evidence.json +20 -0
  276. finpanel-0.1.0a2/tests/test_asof.py +635 -0
  277. finpanel-0.1.0a2/tests/test_cache.py +38 -0
  278. finpanel-0.1.0a2/tests/test_cli.py +113 -0
  279. finpanel-0.1.0a2/tests/test_client.py +193 -0
  280. finpanel-0.1.0a2/tests/test_derivation_authentic.py +138 -0
  281. finpanel-0.1.0a2/tests/test_derivation_cli.py +95 -0
  282. finpanel-0.1.0a2/tests/test_derivation_integration.py +87 -0
  283. finpanel-0.1.0a2/tests/test_derivation_models.py +55 -0
  284. finpanel-0.1.0a2/tests/test_derivation_revisions.py +196 -0
  285. finpanel-0.1.0a2/tests/test_derivation_scope.py +176 -0
  286. finpanel-0.1.0a2/tests/test_filings.py +313 -0
  287. finpanel-0.1.0a2/tests/test_filings_cli.py +71 -0
  288. finpanel-0.1.0a2/tests/test_history_acceptance.py +70 -0
  289. finpanel-0.1.0a2/tests/test_history_client.py +107 -0
  290. finpanel-0.1.0a2/tests/test_metric_authentic.py +96 -0
  291. finpanel-0.1.0a2/tests/test_metric_candidates.py +96 -0
  292. finpanel-0.1.0a2/tests/test_metric_cli.py +103 -0
  293. finpanel-0.1.0a2/tests/test_metric_registry.py +54 -0
  294. finpanel-0.1.0a2/tests/test_metric_resolution.py +166 -0
  295. finpanel-0.1.0a2/tests/test_panel_authentic.py +49 -0
  296. finpanel-0.1.0a2/tests/test_panel_cli.py +51 -0
  297. finpanel-0.1.0a2/tests/test_panel_contract.py +107 -0
  298. finpanel-0.1.0a2/tests/test_panel_engine.py +145 -0
  299. finpanel-0.1.0a2/tests/test_panel_exports.py +136 -0
  300. finpanel-0.1.0a2/tests/test_panel_replay.py +132 -0
  301. finpanel-0.1.0a2/tests/test_parsers.py +193 -0
  302. finpanel-0.1.0a2/tests/test_periods.py +485 -0
  303. finpanel-0.1.0a2/tests/test_provenance.py +569 -0
  304. finpanel-0.1.0a2/tests/test_release_example.py +60 -0
  305. finpanel-0.1.0a2/tests/test_release_historical.py +321 -0
  306. finpanel-0.1.0a2/tests/test_release_portability.py +46 -0
  307. finpanel-0.1.0a2/tests/test_sec_snapshots.py +59 -0
  308. finpanel-0.1.0a2/tests/test_snapshot_capture.py +95 -0
  309. finpanel-0.1.0a2/tests/test_snapshots_authentic.py +124 -0
  310. finpanel-0.1.0a2/tests/test_snapshots_cli.py +60 -0
  311. finpanel-0.1.0a2/tests/test_snapshots_pipeline.py +256 -0
  312. finpanel-0.1.0a2/tests/test_snapshots_store.py +202 -0
  313. finpanel-0.1.0a2/tests/test_validation_acquisition.py +75 -0
  314. finpanel-0.1.0a2/tests/test_validation_cli.py +30 -0
  315. finpanel-0.1.0a2/tests/test_validation_example.py +56 -0
  316. finpanel-0.1.0a2/tests/test_validation_goldens.py +141 -0
  317. finpanel-0.1.0a2/tests/test_validation_resume.py +177 -0
  318. finpanel-0.1.0a2/tests/test_validation_reuse.py +61 -0
  319. finpanel-0.1.0a2/tests/test_validation_runner.py +101 -0
  320. finpanel-0.1.0a2/tests/test_validation_universe.py +42 -0
  321. finpanel-0.1.0a2/tests/test_xbrl_authentic.py +113 -0
  322. finpanel-0.1.0a2/tests/test_xbrl_cli.py +144 -0
  323. finpanel-0.1.0a2/tests/test_xbrl_discovery.py +108 -0
  324. finpanel-0.1.0a2/tests/test_xbrl_integration.py +115 -0
  325. finpanel-0.1.0a2/tests/test_xbrl_parser.py +238 -0
  326. finpanel-0.1.0a2/tests/test_xbrl_verification.py +159 -0
@@ -0,0 +1,4 @@
1
+ # Frozen source bytes are hash-verified evidence, not editable text.
2
+ # Preserve their original line endings even when core.autocrlf is enabled.
3
+ tests/fixtures/** -text
4
+ src/finpanel/example_data/** -text
@@ -0,0 +1,40 @@
1
+ # Changelog
2
+
3
+ ## 0.1.0a2 — preparation, not yet published
4
+
5
+ Intended tag: `v0.1.0-alpha.2`. This is a documentation/packaging synchronization
6
+ update: corrected public GitHub installation instructions, researcher guide and
7
+ release-status documentation now accompany refreshed wheel metadata and embedded
8
+ README. README links are absolute for package-index rendering.
9
+
10
+ No financial/accounting semantics, metric contracts, revision, as-of or provenance
11
+ behavior changed. The versioned software identity changes; old receipts still
12
+ require their original matching software. A1 tags and assets are preserved.
13
+
14
+
15
+ ## 0.1.0a1 — GitHub alpha pre-release (2026-10-08)
16
+
17
+ Published [GitHub pre-release v0.1.0-alpha](https://github.com/finleydoudou/FinPanel/releases/tag/v0.1.0-alpha) (first alpha).
18
+ PyPI publication has not occurred. See [current release status](docs/release-status.md). Use `0.1.0a1` in Python
19
+ package metadata and dependency specifications; the label is an explicit mapping.
20
+
21
+ - Preserve frozen evidence bytes during Git checkout on Windows.
22
+ - Make optional example memory telemetry unavailable rather than failing when the
23
+ Unix `resource` module is absent. No accounting or provenance contract changed.
24
+
25
+ - Prepare an alpha package for reproducible point-in-time SEC fundamentals.
26
+ - Add authentic historical fiscal-calendar and revision/restatement audit ledgers,
27
+ with conservative diagnostics and original narrative provenance.
28
+ - Add deterministic validation jobs, verified issuer checkpoints, resume equivalence,
29
+ corruption rejection, writer locking, and batch failure records.
30
+ - Expand the purposive validation universe from 50 to 100 ordinary US-GAAP issuers.
31
+ - Include a small authentic offline panel example in installed artifacts.
32
+ - Document the public/experimental/private API boundary and supported Python 3.12.
33
+ - Add first-party tzdata fallback for systems without an IANA timezone database.
34
+ - Add cross-platform CI configuration and separate clean wheel/sdist install checks.
35
+ - Prepare researcher onboarding, source notices, validation evidence, and release checklist.
36
+
37
+ No new financial metric or unsupported sector ontology was added. Existing reported
38
+ metric defaults and accounting selection rules are unchanged. The package/software
39
+ identity changes intentionally; exact older receipts require matching older software.
40
+ Prior work packages remain the historical baseline, not separate published releases.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 FinPanel contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,16 @@
1
+ include LICENSE README.md pyproject.toml
2
+ recursive-include tests *.py *.json
3
+ recursive-include tests/fixtures *.sgml
4
+ recursive-include examples *.py
5
+
6
+ recursive-include docs *.json *.md
7
+ recursive-include tests/fixtures/xbrl *.xml *.html
8
+
9
+ recursive-include src/finpanel/validation *.json
10
+ recursive-include tests/fixtures/broad *.gz
11
+
12
+ include CHANGELOG.md THIRD_PARTY_NOTICES.md
13
+ include .gitattributes
14
+ recursive-include tests/fixtures/release *.gz
15
+
16
+ recursive-include scripts *.py
@@ -0,0 +1,195 @@
1
+ Metadata-Version: 2.4
2
+ Name: finpanel
3
+ Version: 0.1.0a2
4
+ Summary: Research infrastructure for reproducible point-in-time SEC fundamentals
5
+ License-Expression: MIT
6
+ Project-URL: Repository, https://github.com/finleydoudou/FinPanel
7
+ Project-URL: Issues, https://github.com/finleydoudou/FinPanel/issues
8
+ Project-URL: Documentation, https://github.com/finleydoudou/FinPanel#readme
9
+ Classifier: Development Status :: 3 - Alpha
10
+ Classifier: Intended Audience :: Science/Research
11
+ Classifier: Programming Language :: Python :: 3.12
12
+ Classifier: Topic :: Scientific/Engineering :: Information Analysis
13
+ Requires-Python: <3.13,>=3.12
14
+ Description-Content-Type: text/markdown
15
+ License-File: LICENSE
16
+ License-File: THIRD_PARTY_NOTICES.md
17
+ Requires-Dist: httpx<0.29,>=0.28
18
+ Requires-Dist: simplejson<5,>=3.19
19
+ Requires-Dist: pyarrow<24,>=18
20
+ Requires-Dist: duckdb<2,>=1.5
21
+ Requires-Dist: tzdata>=2024.1
22
+ Provides-Extra: dev
23
+ Requires-Dist: pytest<10,>=8; extra == "dev"
24
+ Requires-Dist: ruff<1,>=0.11; extra == "dev"
25
+ Requires-Dist: build<2,>=1; extra == "dev"
26
+ Dynamic: license-file
27
+
28
+ # FinPanel
29
+
30
+ Research infrastructure for reproducible point-in-time SEC fundamentals.
31
+
32
+ FinPanel builds financial research panels from SEC filings and XBRL facts while
33
+ preserving which evidence supports each result. Choose a historical cutoff, pin
34
+ the captured evidence, and replay the result later. Unavailable or conflicting
35
+ facts remain explicit states instead of silently becoming numbers.
36
+
37
+ The alpha pre-release supports six metrics for ordinary US-GAAP operating companies:
38
+ revenue, net income, assets, liabilities, cash and cash equivalents, and operating
39
+ cash flow. It supports reported periods and conservative Q2/Q3/Q4 derivations.
40
+ Banks, insurers, IFRS normalization, segment aggregation, FX normalization, prices,
41
+ and returns are outside scope. Historical/original-XBRL evidence is incomplete for
42
+ some issuers; extension-heavy or dimension-heavy disclosures may remain unresolved.
43
+
44
+ **Alpha.2:** this source tree builds package **0.1.0a2**, with Git label
45
+ `v0.1.0-alpha.2`. Python **3.12** is required. Check the
46
+ [release list](https://github.com/finleydoudou/FinPanel/releases) and
47
+ [PyPI project](https://pypi.org/project/finpanel/) for publication availability;
48
+ source preparation alone does not imply that a release has been published.
49
+ The existing [a1 GitHub pre-release](https://github.com/finleydoudou/FinPanel/releases/tag/v0.1.0-alpha)
50
+ (package `0.1.0a1`) remains unchanged.
51
+ See [validation evidence](https://github.com/finleydoudou/FinPanel/blob/main/docs/release-validation.md)
52
+ and [release notes](https://github.com/finleydoudou/FinPanel/blob/main/docs/release-a2-notes.md).
53
+ This is experimental research software, not a stable production release.
54
+
55
+ ## Installation
56
+
57
+ Once version `0.1.0a2` is available on production PyPI, install that exact version
58
+ in a clean Python 3.12 environment with `python -m pip install finpanel==0.1.0a2`.
59
+ Before publication, use only a verified candidate wheel supplied with its
60
+ `SHA256SUMS.txt`. Do not substitute an a1 artifact or rename its wheel.
61
+ For published a1 users, follow the
62
+ [a1 installation instructions](https://github.com/finleydoudou/FinPanel/blob/07f3e16fcf18019b16e5ac25d575e646d126c570/README.md#installation).
63
+
64
+ The verified-wheel workflow below also works for a2 GitHub release assets when
65
+ available. Maintainers build fresh artifacts from the exact authorized source;
66
+ the a2 wheel is named `finpanel-0.1.0a2-py3-none-any.whl`.
67
+
68
+ In the artifact folder, print the wheel hash:
69
+
70
+ ```bash
71
+ # macOS
72
+ shasum -a 256 finpanel-0.1.0a2-py3-none-any.whl
73
+ # Linux
74
+ sha256sum finpanel-0.1.0a2-py3-none-any.whl
75
+ ```
76
+
77
+ ```powershell
78
+ # Windows PowerShell
79
+ Get-FileHash finpanel-0.1.0a2-py3-none-any.whl -Algorithm SHA256
80
+ ```
81
+
82
+ Manually compare the printed hash with the wheel's row in the supplied checksum
83
+ file (case-insensitively); stop on a mismatch. Comparison is not automatic.
84
+
85
+ Create and activate a clean Python 3.12 environment:
86
+
87
+ ```bash
88
+ # macOS/Linux
89
+ python3.12 -m venv .venv
90
+ source .venv/bin/activate
91
+ ```
92
+
93
+ ```powershell
94
+ # Windows PowerShell
95
+ py -3.12 -m venv .venv
96
+ .\.venv\Scripts\Activate.ps1
97
+ ```
98
+
99
+ Then install the candidate and verify:
100
+
101
+ ```bash
102
+ python -m pip install ./finpanel-0.1.0a2-py3-none-any.whl
103
+ python -c "import finpanel; print(finpanel.__version__)"
104
+ python -m finpanel.cli --help
105
+ ```
106
+
107
+ Expected candidate version: `0.1.0a2`. Dependencies may download from PyPI; the
108
+ FinPanel package comes from the supplied wheel. The example below is offline.
109
+ If PowerShell activation is unavailable, invoke `.\.venv\Scripts\python.exe`
110
+ in place of `python` without changing execution policy.
111
+
112
+ For an intentional source clone, see the
113
+ [developer/source workflow](https://github.com/finleydoudou/FinPanel/blob/main/docs/researcher-guide.md#developer-source-user).
114
+
115
+ ## Quick Start — no SEC credentials
116
+
117
+ After installation, run this from your own working directory. Choose a fresh
118
+ output directory each time:
119
+
120
+ ```bash
121
+ python -m finpanel.example output/quickstart
122
+ ```
123
+
124
+ This uses bundled, hash-verified H&R Block SEC captures. It creates six FY2022
125
+ cells, CSV/Parquet/DuckDB exports, provenance sidecars, and a replay receipt. Three
126
+ cells resolve under the example's cutoff and conservative contracts; three remain
127
+ unresolved. That is **coverage**, not an accuracy percentage. No network access or
128
+ large corpus download is needed. Choose a fresh output directory each time.
129
+
130
+ ```python
131
+ from finpanel import panel
132
+
133
+ rows = panel.read_export("output/quickstart/panel.parquet")
134
+ for row in rows:
135
+ print(row["metric"], row["state"], row["value"])
136
+ ```
137
+
138
+ See the [researcher guide](https://github.com/finleydoudou/FinPanel/blob/main/docs/researcher-guide.md) for a custom panel, historical
139
+ cutoffs, original XBRL verification, pinned replay, and troubleshooting.
140
+
141
+ ## What reproducibility means here
142
+
143
+ - A filing-availability proxy limits facts, filings, and calendar anchors before
144
+ interpretation. Today's fiscal-year-end cannot explain all historical years.
145
+ - `first_reported` and `latest_available` choose temporal candidates within exact
146
+ source identities. Different concepts or incompatible scopes are not merged.
147
+ - Derived quarters retain both cumulative operands. Incompatible revision states
148
+ produce a conflict rather than plausible arithmetic.
149
+ - CompanyFacts is a captured aggregate feed. Filing-time eligibility does **not**
150
+ establish when that aggregate feed first delivered a fact. Snapshot capture time
151
+ and historical information cutoff are different dimensions.
152
+ - Exact replay requires the original snapshot and matching software/contracts.
153
+ CSV semantic rows are deterministic; container bytes and performance timing are
154
+ not cross-platform reproducibility promises.
155
+
156
+ ## Validation and release status
157
+
158
+ - Alpha.2 package: **0.1.0a2**, Git label **v0.1.0-alpha.2**. Check the release list for publication availability.
159
+ - Existing public GitHub release: [a1](https://github.com/finleydoudou/FinPanel/releases/tag/v0.1.0-alpha), package **0.1.0a1**, unchanged.
160
+ - Production PyPI: **not published**. TestPyPI rehearsal is conditional on gates and account setup; it is not a production release.
161
+ - Supported Python: **3.12**. [A2 software CI](https://github.com/finleydoudou/FinPanel/actions/runs/37799312175) passed macOS/Linux/Windows with **814 tests / 0 skipped** each on the TestPyPI-tested software candidate. Final release-only documentation/workflow changes additionally require successful CI on the exact final commit before publication.
162
+
163
+ The audited population contains 100 ordinary US-GAAP operating companies and
164
+ 24,000 financial cells. **69.61% scalar coverage is not accuracy**. All 255
165
+ independently audited golden expectations, 2,435,238 invariant checks and 500
166
+ future-evidence mutation checks passed, with zero unexpected mismatches **within
167
+ that specified audited population**. This is not a universal accuracy or
168
+ market-wide support claim.
169
+
170
+ Read the [validation evidence](https://github.com/finleydoudou/FinPanel/blob/main/docs/release-validation.md),
171
+ [API/support policy](https://github.com/finleydoudou/FinPanel/blob/main/docs/api-stability.md), and [current release status](https://github.com/finleydoudou/FinPanel/blob/main/docs/release-status.md).
172
+ The [earlier gate](https://github.com/finleydoudou/FinPanel/blob/main/docs/release-candidate-gate.md) and
173
+ [earlier checklist](https://github.com/finleydoudou/FinPanel/blob/main/docs/release-checklist.md) are explicitly historical records;
174
+ their original Windows failures are preserved, not current release blockers.
175
+
176
+ ## Development
177
+
178
+ ```bash
179
+ python -m pip install -e '.[dev]'
180
+ pytest
181
+ ruff check .
182
+ ruff format --check .
183
+ python -m build
184
+ python scripts/validate_install.py dist
185
+ ```
186
+
187
+ Routine tests and the clean-install example use frozen evidence. Live SEC
188
+ acquisition is a separate, explicitly configured operation. Never commit an SEC
189
+ contact identity, credentials, or the local Tier B corpus.
190
+
191
+ Detailed references: [accounting/API workflows](https://github.com/finleydoudou/FinPanel/blob/main/docs/technical-reference.md),
192
+ [panels](https://github.com/finleydoudou/FinPanel/blob/main/docs/research-panels.md), [broad validation](https://github.com/finleydoudou/FinPanel/blob/main/docs/broad-validation.md),
193
+ [historical/revision audit](https://github.com/finleydoudou/FinPanel/blob/main/docs/historical-audit.md),
194
+ [resume](https://github.com/finleydoudou/FinPanel/blob/main/docs/resumable-validation.md), [changelog](https://github.com/finleydoudou/FinPanel/blob/main/CHANGELOG.md),
195
+ [third-party notices](https://github.com/finleydoudou/FinPanel/blob/main/THIRD_PARTY_NOTICES.md), and [MIT license](https://github.com/finleydoudou/FinPanel/blob/main/LICENSE).
@@ -0,0 +1,168 @@
1
+ # FinPanel
2
+
3
+ Research infrastructure for reproducible point-in-time SEC fundamentals.
4
+
5
+ FinPanel builds financial research panels from SEC filings and XBRL facts while
6
+ preserving which evidence supports each result. Choose a historical cutoff, pin
7
+ the captured evidence, and replay the result later. Unavailable or conflicting
8
+ facts remain explicit states instead of silently becoming numbers.
9
+
10
+ The alpha pre-release supports six metrics for ordinary US-GAAP operating companies:
11
+ revenue, net income, assets, liabilities, cash and cash equivalents, and operating
12
+ cash flow. It supports reported periods and conservative Q2/Q3/Q4 derivations.
13
+ Banks, insurers, IFRS normalization, segment aggregation, FX normalization, prices,
14
+ and returns are outside scope. Historical/original-XBRL evidence is incomplete for
15
+ some issuers; extension-heavy or dimension-heavy disclosures may remain unresolved.
16
+
17
+ **Alpha.2:** this source tree builds package **0.1.0a2**, with Git label
18
+ `v0.1.0-alpha.2`. Python **3.12** is required. Check the
19
+ [release list](https://github.com/finleydoudou/FinPanel/releases) and
20
+ [PyPI project](https://pypi.org/project/finpanel/) for publication availability;
21
+ source preparation alone does not imply that a release has been published.
22
+ The existing [a1 GitHub pre-release](https://github.com/finleydoudou/FinPanel/releases/tag/v0.1.0-alpha)
23
+ (package `0.1.0a1`) remains unchanged.
24
+ See [validation evidence](https://github.com/finleydoudou/FinPanel/blob/main/docs/release-validation.md)
25
+ and [release notes](https://github.com/finleydoudou/FinPanel/blob/main/docs/release-a2-notes.md).
26
+ This is experimental research software, not a stable production release.
27
+
28
+ ## Installation
29
+
30
+ Once version `0.1.0a2` is available on production PyPI, install that exact version
31
+ in a clean Python 3.12 environment with `python -m pip install finpanel==0.1.0a2`.
32
+ Before publication, use only a verified candidate wheel supplied with its
33
+ `SHA256SUMS.txt`. Do not substitute an a1 artifact or rename its wheel.
34
+ For published a1 users, follow the
35
+ [a1 installation instructions](https://github.com/finleydoudou/FinPanel/blob/07f3e16fcf18019b16e5ac25d575e646d126c570/README.md#installation).
36
+
37
+ The verified-wheel workflow below also works for a2 GitHub release assets when
38
+ available. Maintainers build fresh artifacts from the exact authorized source;
39
+ the a2 wheel is named `finpanel-0.1.0a2-py3-none-any.whl`.
40
+
41
+ In the artifact folder, print the wheel hash:
42
+
43
+ ```bash
44
+ # macOS
45
+ shasum -a 256 finpanel-0.1.0a2-py3-none-any.whl
46
+ # Linux
47
+ sha256sum finpanel-0.1.0a2-py3-none-any.whl
48
+ ```
49
+
50
+ ```powershell
51
+ # Windows PowerShell
52
+ Get-FileHash finpanel-0.1.0a2-py3-none-any.whl -Algorithm SHA256
53
+ ```
54
+
55
+ Manually compare the printed hash with the wheel's row in the supplied checksum
56
+ file (case-insensitively); stop on a mismatch. Comparison is not automatic.
57
+
58
+ Create and activate a clean Python 3.12 environment:
59
+
60
+ ```bash
61
+ # macOS/Linux
62
+ python3.12 -m venv .venv
63
+ source .venv/bin/activate
64
+ ```
65
+
66
+ ```powershell
67
+ # Windows PowerShell
68
+ py -3.12 -m venv .venv
69
+ .\.venv\Scripts\Activate.ps1
70
+ ```
71
+
72
+ Then install the candidate and verify:
73
+
74
+ ```bash
75
+ python -m pip install ./finpanel-0.1.0a2-py3-none-any.whl
76
+ python -c "import finpanel; print(finpanel.__version__)"
77
+ python -m finpanel.cli --help
78
+ ```
79
+
80
+ Expected candidate version: `0.1.0a2`. Dependencies may download from PyPI; the
81
+ FinPanel package comes from the supplied wheel. The example below is offline.
82
+ If PowerShell activation is unavailable, invoke `.\.venv\Scripts\python.exe`
83
+ in place of `python` without changing execution policy.
84
+
85
+ For an intentional source clone, see the
86
+ [developer/source workflow](https://github.com/finleydoudou/FinPanel/blob/main/docs/researcher-guide.md#developer-source-user).
87
+
88
+ ## Quick Start — no SEC credentials
89
+
90
+ After installation, run this from your own working directory. Choose a fresh
91
+ output directory each time:
92
+
93
+ ```bash
94
+ python -m finpanel.example output/quickstart
95
+ ```
96
+
97
+ This uses bundled, hash-verified H&R Block SEC captures. It creates six FY2022
98
+ cells, CSV/Parquet/DuckDB exports, provenance sidecars, and a replay receipt. Three
99
+ cells resolve under the example's cutoff and conservative contracts; three remain
100
+ unresolved. That is **coverage**, not an accuracy percentage. No network access or
101
+ large corpus download is needed. Choose a fresh output directory each time.
102
+
103
+ ```python
104
+ from finpanel import panel
105
+
106
+ rows = panel.read_export("output/quickstart/panel.parquet")
107
+ for row in rows:
108
+ print(row["metric"], row["state"], row["value"])
109
+ ```
110
+
111
+ See the [researcher guide](https://github.com/finleydoudou/FinPanel/blob/main/docs/researcher-guide.md) for a custom panel, historical
112
+ cutoffs, original XBRL verification, pinned replay, and troubleshooting.
113
+
114
+ ## What reproducibility means here
115
+
116
+ - A filing-availability proxy limits facts, filings, and calendar anchors before
117
+ interpretation. Today's fiscal-year-end cannot explain all historical years.
118
+ - `first_reported` and `latest_available` choose temporal candidates within exact
119
+ source identities. Different concepts or incompatible scopes are not merged.
120
+ - Derived quarters retain both cumulative operands. Incompatible revision states
121
+ produce a conflict rather than plausible arithmetic.
122
+ - CompanyFacts is a captured aggregate feed. Filing-time eligibility does **not**
123
+ establish when that aggregate feed first delivered a fact. Snapshot capture time
124
+ and historical information cutoff are different dimensions.
125
+ - Exact replay requires the original snapshot and matching software/contracts.
126
+ CSV semantic rows are deterministic; container bytes and performance timing are
127
+ not cross-platform reproducibility promises.
128
+
129
+ ## Validation and release status
130
+
131
+ - Alpha.2 package: **0.1.0a2**, Git label **v0.1.0-alpha.2**. Check the release list for publication availability.
132
+ - Existing public GitHub release: [a1](https://github.com/finleydoudou/FinPanel/releases/tag/v0.1.0-alpha), package **0.1.0a1**, unchanged.
133
+ - Production PyPI: **not published**. TestPyPI rehearsal is conditional on gates and account setup; it is not a production release.
134
+ - Supported Python: **3.12**. [A2 software CI](https://github.com/finleydoudou/FinPanel/actions/runs/37799312175) passed macOS/Linux/Windows with **814 tests / 0 skipped** each on the TestPyPI-tested software candidate. Final release-only documentation/workflow changes additionally require successful CI on the exact final commit before publication.
135
+
136
+ The audited population contains 100 ordinary US-GAAP operating companies and
137
+ 24,000 financial cells. **69.61% scalar coverage is not accuracy**. All 255
138
+ independently audited golden expectations, 2,435,238 invariant checks and 500
139
+ future-evidence mutation checks passed, with zero unexpected mismatches **within
140
+ that specified audited population**. This is not a universal accuracy or
141
+ market-wide support claim.
142
+
143
+ Read the [validation evidence](https://github.com/finleydoudou/FinPanel/blob/main/docs/release-validation.md),
144
+ [API/support policy](https://github.com/finleydoudou/FinPanel/blob/main/docs/api-stability.md), and [current release status](https://github.com/finleydoudou/FinPanel/blob/main/docs/release-status.md).
145
+ The [earlier gate](https://github.com/finleydoudou/FinPanel/blob/main/docs/release-candidate-gate.md) and
146
+ [earlier checklist](https://github.com/finleydoudou/FinPanel/blob/main/docs/release-checklist.md) are explicitly historical records;
147
+ their original Windows failures are preserved, not current release blockers.
148
+
149
+ ## Development
150
+
151
+ ```bash
152
+ python -m pip install -e '.[dev]'
153
+ pytest
154
+ ruff check .
155
+ ruff format --check .
156
+ python -m build
157
+ python scripts/validate_install.py dist
158
+ ```
159
+
160
+ Routine tests and the clean-install example use frozen evidence. Live SEC
161
+ acquisition is a separate, explicitly configured operation. Never commit an SEC
162
+ contact identity, credentials, or the local Tier B corpus.
163
+
164
+ Detailed references: [accounting/API workflows](https://github.com/finleydoudou/FinPanel/blob/main/docs/technical-reference.md),
165
+ [panels](https://github.com/finleydoudou/FinPanel/blob/main/docs/research-panels.md), [broad validation](https://github.com/finleydoudou/FinPanel/blob/main/docs/broad-validation.md),
166
+ [historical/revision audit](https://github.com/finleydoudou/FinPanel/blob/main/docs/historical-audit.md),
167
+ [resume](https://github.com/finleydoudou/FinPanel/blob/main/docs/resumable-validation.md), [changelog](https://github.com/finleydoudou/FinPanel/blob/main/CHANGELOG.md),
168
+ [third-party notices](https://github.com/finleydoudou/FinPanel/blob/main/THIRD_PARTY_NOTICES.md), and [MIT license](https://github.com/finleydoudou/FinPanel/blob/main/LICENSE).
@@ -0,0 +1,50 @@
1
+ # Third-party notices and evidence provenance
2
+
3
+ FinPanel's own source is distributed under the repository's MIT license. That
4
+ license does not purport to relicense third-party dependencies or issuer filings.
5
+
6
+ ## Dependencies
7
+
8
+ Dependencies are installed separately; FinPanel does not vendor their source.
9
+ Their installed distributions carry their own license files and notices.
10
+
11
+ | Component | Use | Declared runtime range | License reference |
12
+ |---|---|---|---|
13
+ | HTTPX | SEC HTTP transport, timeouts, response handling | `>=0.28,<0.29` | [BSD-3-Clause](https://github.com/encode/httpx/blob/master/LICENSE.md) |
14
+ | simplejson | Exact decimal JSON reading/writing | `>=3.19,<5` | [MIT or AFL-2.1](https://github.com/simplejson/simplejson/blob/main/LICENSE.txt) |
15
+ | PyArrow | Typed Parquet and Arrow interchange | `>=18,<24` | [Apache-2.0 and bundled-component notices](https://github.com/apache/arrow/blob/main/LICENSE.txt) |
16
+ | tzdata | IANA timezone fallback on systems without zone data | `>=2024.1` | [Apache-2.0 package metadata](https://pypi.org/project/tzdata/) |
17
+ | DuckDB | Local analytical export and read-back | `>=1.5,<2` | [MIT](https://duckdb.org/faq) |
18
+
19
+ Development-only pytest, Ruff, build, and build-backend setuptools identify MIT
20
+ licenses in their installed metadata. These are not added as runtime dependencies.
21
+ No dependency was removed: all existing runtime dependencies have exercised uses. The added first-party tzdata
22
+ fallback supplies the SEC local timezone on platforms without a system IANA database.
23
+ No assertion is made that every allowed dependency combination was tested; see
24
+ [the support audit](docs/api-stability.md) for actual versions.
25
+
26
+ This inventory records upstream licensing information, not a legal opinion about
27
+ all downstream redistribution arrangements. If dependencies are bundled into a
28
+ standalone binary, preserve their complete distributed notices, including transitive
29
+ components; the short table above does not replace them.
30
+
31
+ ## Authentic SEC evidence
32
+
33
+ Frozen evidence comes from the official SEC hosts `data.sec.gov` and `www.sec.gov`.
34
+ Each fixture manifest records its source URL, accession where applicable, retrieval
35
+ time, original byte hash, and the lossless compressed-transport hash. Small regression
36
+ captures and the packaged HRB example are source material for reproducible research;
37
+ they are not authored by FinPanel. Public availability through EDGAR is not a blanket
38
+ claim that every issuer-authored narrative, attachment, image, or trademark is public
39
+ domain. FinPanel claims no ownership or endorsement over that material.
40
+
41
+ WP7 includes HRB, Mattel, and Kraft Heinz aggregates and two issuer narrative filings.
42
+ The full source URLs and hashes live in `tests/fixtures/release/manifest.json`.
43
+ The installed onboarding example contains HRB JSON responses only, with its separate
44
+ `finpanel/example_data/manifest.json`. Lossless gzip is transport, not altered evidence.
45
+ Synthetic test mutations are identified as synthetic and do not replace raw captures.
46
+
47
+ The broader Tier B SEC corpus remains local and ignored; it is excluded from wheel,
48
+ source distribution, and Git. Before an actual public release, review the specific
49
+ bundled issuer-authored narrative fixtures and the intended distribution context.
50
+ This preparation does not grant rights beyond those held by the original sources.
@@ -0,0 +1,103 @@
1
+ # API and package stability policy
2
+
3
+ This is a pre-release compatibility commitment within the existing research scope,
4
+ not a v1 promise that all importable Python names are public. Existing WP1–WP6
5
+ calls and default behavior are retained. No namespace was removed or renamed.
6
+
7
+ ## Intended supported research surface
8
+
9
+ | Surface | Entry points / return models | Contract |
10
+ |---|---|---|
11
+ | Raw SEC | `SECClient`, `submissions`, `companyfacts`, raw response/parse models | Explicit CIK; online identity required; offline cache misses fail |
12
+ | Filing/fact inspection | `filings.timeline`, `filings.available_as_of`, `facts.for_concept`, typed filing/fact records | Original raw fields and precision retained |
13
+ | Bounded interpretation | `asof.view`, `asof.revisions`, `periods.for_concept`, `revisions.analyze` | Explicit as-of versus retrospective mode; exact concept groups |
14
+ | Canonical metrics | Exports in `metrics.__all__`, especially `candidates`, `resolve`, `derive_quarter`, `resolve_quarter`, `compare_quarter` | Six declared metrics; reported-only `resolve`; explicit quarter policies |
15
+ | Snapshots | `EvidenceStore`, `Artifact`, `Snapshot`, `Integrity`, `run`, `reproduce`, `read_receipt`, `export_bundle` | Immutable byte captures; explicit version selection; fail-closed replay |
16
+ | Panels | `PanelRequest`, `PeriodEnd`, `PanelRow`, `PanelResult`, `PanelReceipt`, `build`, `export`, `read_export`, `reproduce` | Complete explicit grid, state/provenance per row, lossless semantic exports |
17
+ | Original XBRL | `xbrl.__all__`, including `inspect_filing`, `verify_fact`, `verify_metric`, `verify_derivation` | Supported XML only; retrieval-bounded verification; no fabricated dimensions |
18
+
19
+ Dataclass return models distinguish absence, ambiguity, unsupported scope, conflict,
20
+ and usable scalar results. `PanelRequest` normalizes query dimensions and validates
21
+ policies. Monetary values remain `int`/`Decimal`; portable exports carry exact decimal
22
+ text and number kind. JSON serialization uses `finpanel.serialization.dumps/loads`;
23
+ plain `json.dumps` is not a replacement for exact Decimal/model serialization.
24
+
25
+ Public metric entry points and models already carry type annotations. WP7 adds
26
+ annotations to panel build/replay/export/read-back arguments and returns and a
27
+ reported-only resolver docstring. Dynamic provenance dictionaries are intentional;
28
+ the whole package is not advertised as fully statically type-checked. Named states
29
+ remain strings validated by contracts rather than a new breaking enum conversion.
30
+
31
+ ### Errors
32
+
33
+ `FinPanelError` is the shared expected-operation base. `ValidationError` also inherits
34
+ `ValueError`; cache failures use `CacheError`/`CacheMissError`, transport failures use
35
+ `SECRequestError`/`SECTimeoutError`, snapshot/replay uses `SnapshotError`, and strict
36
+ panel builds use `PanelBuildError`. Transport errors expose URL, attempt count, and
37
+ status where available, not credentials. Parse issues and unresolved financial
38
+ states normally appear in returned evidence/results; they are not automatically
39
+ exceptions. `errors="raise"` is the explicit strict panel option.
40
+
41
+ ### Experimental and private
42
+
43
+ `validation.*` (universe, acquisition, historical diagnostics, benchmark reports,
44
+ checkpoints, and goldens), the `validate` CLI namespace, and `finpanel.example` are
45
+ experimental research tooling. Their formats are versioned and incompatible resumes
46
+ fail explicitly. Model/candidate construction helpers are advanced inspection APIs,
47
+ not permission to bypass cutoff or scope validation.
48
+
49
+ Leading-underscore helpers, `_reuse`, `_PinnedCache`, `_publish`, parser internals,
50
+ CLI dispatch implementation, fixture transport details, and benchmark aggregation
51
+ internals are private. Importability alone gives no stability guarantee. Keep raw
52
+ artifacts and receipts rather than depending on those implementation details.
53
+
54
+ ## Version and replay
55
+
56
+ The prepared PEP 440 version is `0.1.0a2`, mapped to intended tag
57
+ `v0.1.0-alpha.2`. This is a documentation/packaging refresh, not a new financial
58
+ contract. The published a1 tag/package remain unchanged. Production publication
59
+ requires separate authorization. Receipt identity
60
+ includes the package version, source hash, Python patch version, and exact relevant
61
+ JSON/transport dependency versions. An older WP6 receipt intentionally requires its
62
+ original matching software for exact replay. Updating the package does not silently
63
+ upgrade an old receipt or rewrite its evidence.
64
+
65
+ ## Dependencies and platforms
66
+
67
+ | Dependency | Kind | Declared minimum | Version used in local validation |
68
+ |---|---|---:|---:|
69
+ | httpx | Runtime HTTP transport | 0.28 | 0.28.1 |
70
+ | simplejson | Runtime exact JSON | 3.19 | 4.2.0 |
71
+ | pyarrow | Runtime Parquet/Arrow | 18 | 23.0.1 |
72
+ | duckdb | Runtime analytical export | 1.5 | 1.5.6 |
73
+ | tzdata | Runtime IANA timezone fallback | 2024.1 | 2026.5 |
74
+ | setuptools | Build backend only | 77 | 84.0.0 |
75
+ | build | Development build tool | 1 | 1.6.1 |
76
+ | pytest | Development tests | 8 | 9.1.1 |
77
+ | Ruff | Development lint/format | 0.11 | 0.16.10 |
78
+
79
+ These ranges are dependency constraints, not a claim that minimum-version matrices
80
+ were executed. HTTPX/simplejson are used by core ingestion/serialization; Arrow and
81
+ DuckDB support promised export formats, so none is an unused dependency. WP7 adds first-party `tzdata` for Windows and other
82
+ installations without an IANA system database. Clean-install checks disable system
83
+ timezone lookup and exercise winter/summer SEC offsets and the full example. Binary
84
+ wheels and architecture availability matter for Arrow and DuckDB.
85
+
86
+ Python **3.12 only** is declared for this alpha (`>=3.12,<3.13`); local validation uses
87
+ 3.12.14 on macOS arm64. Other Python minors are not claimed. The CI matrix defines
88
+ Python 3.12 on macOS, Linux, and Windows with permanent offline tests, builds, and
89
+ clean artifact installs. The final published release commit
90
+ `30ffbbe658fbc517ec838ba499859ec05093283b` passed all three platforms with
91
+ 814 tests and 0 skipped per platform, including builds and clean installations.
92
+ See [current release status](release-status.md) and its exact-commit CI link.
93
+ The [earlier failed gate](release-candidate-gate.md) remains a historical record;
94
+ its Windows failures were resolved before publication. There is no
95
+ platform-specific accounting fork.
96
+
97
+ `scripts/validate_install.py` installs wheel and sdist into separate new virtual
98
+ environments, runs outside the checkout with isolated Python imports, checks the
99
+ installed CLI/module, executes the bundled offline example, verifies replay, and
100
+ compares all three export round trips. It cannot fall back to the developer editable
101
+ installation. Dependency downloads may use PyPI; SEC access remains disabled.
102
+
103
+ The timezone-data fallback follows the [Python zoneinfo recommendation](https://docs.python.org/3.12/library/zoneinfo.html#data-sources). Local broad validation used the host database; clean installs also verify the packaged fallback. Receipts fail closed on semantic differences; the OS timezone database itself is not yet a separately pinned receipt component.