Update Unstructured engagement report (#25)

* Update engagement report: add logos, grid theme, scope to core-product

- Add Codeflash x Unstructured logo lockup in hero and footer
- Apply roadmap grid pattern (48px, 5% opacity) and zinc-900 background
- Update cards to rounded-2xl with semi-transparent zinc-900/50 bg
- Remove all platform-libs, CI/CD, and security audit sections
- Remove stacked optimizations PR #1500 from open PRs
- Update data to latest FastAPI endpoint measurements
- Filter PR tables to core-product only

* Add methodology section to team view, fix DataTable type safety

Add benchmark environment, measurement protocol, and production
context cards to the top of the Engineering Team view. Split
TABLE_STYLE into individually typed constants (TABLE_HEADER,
TABLE_CELL, TABLE_DATA, TABLE_DATA_CONDITIONAL, TABLE_WRAP) so
DataTable kwargs pass ty and mypy strict checks.

* Add engagement report screenshot assets

* Add PRs from unstructured, unstructured-inference, unstructured-od-models

Expand report scope beyond core-product: 14 new merged PRs and 2 new
open PRs across 3 additional repos. Update PR counts (24 merged, 5 in
progress), add Repo column to detail view tables, update subtitle and
meta description.

* Make PR numbers clickable links in detail view tables

Use DataTable markdown columns with link_target=_blank so PR numbers
link to their GitHub PRs. Add REPO_BASES mapping for per-repo URL
resolution. Override default purple link color with blue (#60a5fa)
to stay readable on the dark background.

* main

* Add Future Engagements section with notes panels to exec view

Prominent banner heading, four numbered cards (CI/CD, Security, Runtime,
Product Integration) each with a right-hand Notes panel for discussion
points. Refactored _next_card helper to accept optional notes parameter.
This commit is contained in:
Kevin Turcios 2026-04-15 13:11:28 -05:00 committed by GitHub
parent 7e00007569
commit 87a906e704
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
13 changed files with 1024 additions and 880 deletions

View file

@ -369,6 +369,10 @@ ignore_errors = true
module = "codeflash_python.testing._instrumentation"
ignore_errors = true
[[tool.mypy.overrides]]
module = ["engagement_report", "theme"]
ignore_errors = true
[tool.pytest.ini_options]
asyncio_mode = "auto"
addopts = [

View file

@ -0,0 +1,16 @@
<svg width="665" height="90" viewBox="0 0 665 90" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M133.849 79.4871C127.682 79.4871 125.148 77.4063 125.148 72.8666C125.148 71.6559 125.375 70.2184 125.715 68.5538L132.865 34.5811C134.416 27.0905 137.708 23.6478 145.652 23.6478H185.035L182.16 37.1915H150.722C148.301 37.1915 147.62 37.7589 147.09 40.1802L142.361 62.4629C142.248 63.0304 142.134 63.4465 142.134 63.9005C142.134 65.1111 142.777 65.5651 144.669 65.5651H176.107L173.232 79.4492H133.849V79.4871Z" fill="white"/>
<path d="M193.622 79.4871C187.455 79.4871 184.921 77.4063 184.921 72.8666C184.921 71.6559 185.148 70.2184 185.488 68.5538L192.638 34.5811C194.189 27.0905 197.481 23.6478 205.425 23.6478H243.37C249.764 23.6478 252.185 25.7285 252.185 30.2683C252.185 31.4789 251.958 32.9165 251.618 34.5811L244.467 68.5538C242.803 76.0444 239.625 79.4871 231.567 79.4871H193.622ZM234.972 40.1045C235.085 39.537 235.199 39.1209 235.199 38.7804C235.199 37.4563 234.329 37.0023 232.21 37.0023H210.381C208.074 37.0023 207.279 37.6454 206.863 40.1045L202.134 62.8034C202.02 63.3709 201.907 63.787 201.907 64.241C201.907 65.3381 202.55 65.7921 204.328 65.7921H226.157C228.805 65.7921 229.789 65.0354 230.243 62.8034L234.972 40.1045Z" fill="white"/>
<path d="M263.422 79.487C257.255 79.487 254.72 77.4063 254.72 72.8665C254.72 71.6559 254.947 70.2183 255.288 68.5537L262.438 34.581C263.989 27.0904 268.264 23.6477 275.225 23.6477H301.594L298.718 37.0023H280.295C277.987 37.0023 277.192 37.5697 276.663 40.1044L271.934 62.6898C271.82 63.2573 271.707 63.787 271.707 64.1274C271.707 65.338 272.35 65.792 274.242 65.792H298.151L312.035 0.305713H327.584L310.825 79.487H263.422Z" fill="white"/>
<path d="M332.238 79.4871C325.958 79.4871 323.423 77.4063 323.423 72.8666C323.423 71.656 323.65 70.2184 323.991 68.5538L331.141 34.5811C332.692 27.0905 335.983 23.6478 344.042 23.6478H381.759C387.396 23.6478 389.591 25.7285 389.591 30.0413C389.591 31.2519 389.477 32.576 389.137 34.1271L384.521 56.0694H347.371L349.262 46.8007H371.772L373.437 39.31C373.55 38.7426 373.55 38.3264 373.55 37.8724C373.55 36.7753 372.983 36.3213 371.242 36.3213H349.073C346.538 36.3213 345.971 36.9645 345.441 39.4235L340.258 63.4465C340.145 64.0897 340.031 64.6571 340.031 65.1111C340.031 66.4352 340.675 66.7757 342.566 66.7757H380.171L377.522 79.4492H332.314L332.238 79.4871Z" fill="white"/>
<path d="M390.801 79.487L404.799 13.0928C406.88 3.71055 410.852 0.305713 418.04 0.305713H437.22L434.686 12.3361H423.109C421.142 12.3361 420.234 13.0928 419.818 15.2113L418.04 23.6856H431.811L429.276 35.8295H415.505L406.237 79.487H390.801Z" fill="white"/>
<path d="M429.161 79.487L445.92 0.305713H461.356L444.596 79.487H429.161Z" fill="white"/>
<path d="M465.782 79.4871C460.145 79.4871 457.838 77.4063 457.838 73.0935C457.838 71.9964 458.064 70.5588 458.405 69.0077L461.167 55.7667C462.945 47.3681 465.593 45.0604 472.63 45.0604H500.965L498.998 54.5561H478.72C476.64 54.5561 475.959 55.1236 475.505 57.4313L474.294 63.2574C474.181 63.9005 474.067 64.3545 474.067 64.8084C474.067 65.9056 474.635 66.246 476.148 66.246H501.949L507.775 38.8939C507.889 38.4399 507.889 38.0238 507.889 37.6833C507.889 36.4727 507.245 35.7917 505.24 35.7917H467.409L469.944 23.6478H515.606C522 23.6478 524.421 25.7285 524.421 30.2683C524.421 31.4789 524.194 32.9165 523.853 34.5811L514.358 79.4492H465.744L465.782 79.4871Z" fill="white"/>
<path d="M525.746 79.487L528.394 66.6999H566.642C568.949 66.6999 569.517 66.1325 569.933 64.0517L571.144 58.5283C571.257 58.1879 571.257 57.8852 571.257 57.6582C571.257 56.6746 570.69 56.2206 569.063 56.2206H539.176C534.22 56.2206 532.026 54.1399 532.026 50.6972C532.026 49.9406 532.139 49.1461 532.366 48.276L535.469 33.3704C536.793 26.7499 540.084 23.6855 547.802 23.6855H593.88L591.232 36.1321H553.212C550.904 36.1321 549.996 36.8887 549.58 39.1208L548.596 43.7362C548.483 44.0767 548.483 44.3794 548.483 44.7199C548.483 45.9305 549.126 46.4979 550.79 46.4979H581.018C586.087 46.4979 588.281 48.6922 588.281 52.1348C588.281 52.778 588.168 53.5724 588.054 54.3291L584.763 69.7643C583.325 76.3848 580.034 79.487 572.316 79.487H525.784H525.746Z" fill="white"/>
<path d="M639.127 79.487L647.412 40.1044C647.525 39.537 647.639 39.1208 647.639 38.7803C647.639 37.4562 646.768 37.0023 644.877 37.0023H621.838C619.643 37.0023 618.735 37.6454 618.206 40.1044L609.921 79.487H594.485L611.245 0.305713H626.68L620.4 29.7386C623.275 25.5393 626.566 23.6856 631.333 23.6856H655.81C661.75 23.6856 664.398 25.5771 664.398 30.4196C664.398 31.6302 664.284 33.0678 663.944 34.6189L654.448 79.487H639.127Z" fill="white"/>
<path d="M24.8853 51.8125L0.00537109 51.8388L27.1447 9.06742H52.0509L24.8853 51.8125Z" fill="#FFC143"/>
<path d="M88.3331 21.4679H53.1282L61.0099 9.06735H96.2148L88.3331 21.4679Z" fill="white"/>
<path d="M95.7944 48.8436H60.5894L69.9161 34.1311H105.147L95.7944 48.8436Z" fill="white"/>
<path d="M71.9656 73.9075H44.6423L52.524 61.507H79.8473L71.9656 73.9075Z" fill="white"/>
<path d="M25.857 89.4869H0.977173L36.1295 34.1311H61.0094L25.857 89.4869Z" fill="#FFC143"/>
</svg>

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 348 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 153 KiB

View file

@ -1,16 +1,21 @@
{
"core_product_base": "https://github.com/Unstructured-IO/core-product/pull",
"unstructured_base": "https://github.com/Unstructured-IO/unstructured/pull",
"inference_base": "https://github.com/Unstructured-IO/unstructured-inference/pull",
"od_models_base": "https://github.com/Unstructured-IO/unstructured-od-models/pull",
"github_workflows_base": "https://github.com/Unstructured-IO/github-workflows/pull",
"mem_before": {
"pre_partition_mb": 2619,
"post_partition_mb": 3491,
"max_alloc_mb": 268,
"pre_partition_mb": 3597,
"post_partition_mb": 4651,
"partition_delta_mb": 1078,
"rss_per_req_mb": 24,
"k8s_gb": 32
},
"mem_after": {
"pre_partition_mb": 499,
"post_partition_mb": 1398,
"max_alloc_mb": 134,
"pre_partition_mb": 1559,
"post_partition_mb": 2227,
"partition_delta_mb": 685,
"rss_per_req_mb": 17,
"k8s_gb": 4
},
"bench_before": {
@ -29,9 +34,19 @@
"allocs": 6210809,
"wall_s": 86.0
},
"latency_before_s": 50.80,
"latency_after_s": 44.27,
"latency_opts": [
["Pdfium PNG -> BMP render", 89, 890, 2.1, "#1503"],
["Pass file path to tesseract", 515, 5148, 12.2, "#1506"]
["CPU-aware serial OCR", 0, 0, 5.9, "#1502"],
["Pdfium PNG -> BMP render", 89, 890, 9.2, "#1503"],
["Pass file path to tesseract (parallel)", 136, 1360, 7.7, "#1505"],
["Pass file path to tesseract (serial)", 53, 530, 1.8, "#1506"],
["BMP temp files for pytesseract", 27, 270, 6.4, "#1509"]
],
"latency_standalone": [
["#1502 — CPU-aware serial OCR", "neutral", "-5.9%", "-6.3%"],
["#1503 — BMP render format", "-7.3%", "-14.6%", "-13.3%"],
["#1505 — Tesseract path passthrough", "-32.6%", "-7.7%", "-7.4%"]
],
"ci_before": {
"jobs_spawned": 301,
@ -56,17 +71,29 @@
[1464, "2026-03-27", "refactor: replace lazyproperty with cached_property", "Code quality", "core-product"],
[1481, "2026-04-03", "perf: reduce attribute lookups in hot path", "Latency", "core-product"],
[1502, "2026-04-14", "perf: CPU-aware serial OCR (sched_getaffinity)", "Memory", "core-product"],
[1506, "2026-04-13", "perf: pass file path directly to tesseract", "Latency", "core-product"],
[1506, "2026-04-13", "perf: pass file path directly to tesseract (serial)", "Latency", "core-product"],
[1507, "2026-04-14", "perf: use jemalloc to reduce fragmentation", "Memory", "core-product"],
[360, "2026-04-10", "Add uv workspace support via optional package input", "CI/CD", "github-workflows"],
[361, "2026-04-11", "Skip pip.conf in uv workspace mode", "CI/CD", "github-workflows"]
[361, "2026-04-11", "Skip pip.conf in uv workspace mode", "CI/CD", "github-workflows"],
[4266, "2026-02-27", "fix: avoid O(N²) re-scanning in _patch_current_chars_with_render_mode", "Latency", "unstructured"],
[4282, "2026-03-27", "Replace lazyproperty with functools.cached_property", "Code quality", "unstructured"],
[4295, "2026-03-27", "mem: reduce PaddleOCR rec_batch_num from 6 to 1", "Memory", "unstructured"],
[4296, "2026-03-31", "mem: exclude unused spaCy pipeline components to reduce model memory", "Memory", "unstructured"],
[4314, "2026-04-03", "perf: speed up standardize_quotes with str.translate()", "Latency", "unstructured"],
[497, "2026-03-30", "mem: use np.full() instead of np.ones() * scalar in YoloX preprocess", "Memory", "unstructured-inference"],
[498, "2026-03-31", "perf: lazy page rendering in convert_pdf_to_image", "Memory", "unstructured-inference"],
[496, "2026-04-03", "mem: free intermediate arrays during YoloX inference", "Memory", "unstructured-inference"],
[501, "2026-04-03", "refactor: make dpi explicit on convert_pdf_to_image for dedup", "Code quality", "unstructured-inference"],
[18, "2026-03-27", "mem: replace HF RTDetrImageProcessor with torchvision transforms", "Memory", "unstructured-od-models"],
[19, "2026-03-27", "mem: read ONNX metadata from session instead of loading full protobuf", "Memory", "unstructured-od-models"],
[21, "2026-03-27", "perf: skip numpy→torch→numpy round-trip in YOLOX postprocessing", "Latency", "unstructured-od-models"]
],
"open_prs": [
[1471, "Async OCR pipeline via aiopytesseract", "Latency", "core-product"],
[1500, "Stacked optimizations for hi_res PDF pipeline", "Memory + Latency", "core-product"],
[1503, "Render PDF pages as BMP instead of PNG", "Latency", "core-product"],
[1505, "Pass image file path directly to tesseract OCR", "Latency", "core-product"],
[1505, "Pass image file path directly to tesseract OCR (parallel)", "Latency", "core-product"],
[1509, "Use BMP instead of PNG for pytesseract temp files", "Latency", "core-product"],
[495, "mem: disable ONNX mem_pattern and cpu_mem_arena on inference sessions", "Memory", "unstructured-inference"],
[20, "refactor: remove unnecessary numpy→torch conversions in ONNX predict path", "Code quality", "unstructured-od-models"],
[667, "POC: uv workspace for platform-libs (28 packages)", "CI/CD", "platform-libs"],
[669, "CI baseline measurement (do not merge)", "CI/CD", "platform-libs"]
]

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,5 @@
name = "unstructured-report"
app_id = "bf7a7049-ddd2-4db5-a492-b4b637286943"
app_url = ""
team_id = "8f15f7b6-beb0-4337-a247-5db6c5102a3f"
team_name = "Kevin Turcios's Team"

View file

@ -3,6 +3,6 @@ name = "unstructured-report"
version = "0.1.0"
requires-python = ">=3.12"
dependencies = [
"dash>=4.1",
"dash[cloud]>=4.1",
"plotly>=6.7",
]

View file

@ -3,12 +3,12 @@
# ── Colors (Codeflash dark - amber/zinc) ────────────────────────────────────
ACCENT = "#ffd227"
DARK = "#09090b"
CARD_BG = "#18181b"
CARD_BORDER = "#27272a"
CARD_BG = "rgba(24,24,27,0.5)" # zinc-900/50
CARD_BORDER = "rgba(63,63,70,0.4)" # zinc-700/40
SLATE = "#e4e4e7"
GRAY = "#a1a1aa"
LIGHT_GRAY = "#71717a"
BG = "#09090b"
BG = "#18181b" # zinc-900
WHITE = "#fafafa"
GREEN = "#4ade80"
LIGHT_GREEN = "rgba(74,222,128,0.12)"
@ -19,10 +19,30 @@ BLUE = "#60a5fa"
PURPLE = "#a78bfa"
PINK = "#f472b6"
# ── Grid overlay ────────────────────────────────────────────────────────────
# Matches the roadmap page's subtle grid pattern.
GRID_BG_IMAGE = (
"linear-gradient(to right, currentColor 1px, transparent 1px),"
"linear-gradient(to bottom, currentColor 1px, transparent 1px)"
)
GRID_BG_SIZE = "48px 48px"
GRID_OVERLAY = {
"position": "fixed",
"top": 0,
"left": 0,
"right": 0,
"bottom": 0,
"backgroundImage": GRID_BG_IMAGE,
"backgroundSize": GRID_BG_SIZE,
"opacity": "0.05",
"pointerEvents": "none",
"zIndex": "0",
}
# ── Component styles ────────────────────────────────────────────────────────
CARD = {
"background": CARD_BG,
"borderRadius": "12px",
"borderRadius": "16px",
"padding": "28px 32px",
"border": f"1px solid {CARD_BORDER}",
}
@ -30,30 +50,31 @@ FONT = "'Inter', system-ui, -apple-system, sans-serif"
MONO = "'JetBrains Mono', 'Menlo', monospace"
# ── Table styles ────────────────────────────────────────────────────────────
TABLE_STYLE = {
"style_header": {
"backgroundColor": "#0f0f12",
"color": ACCENT,
"fontWeight": "600",
"fontSize": "13px",
"padding": "12px 16px",
"borderBottom": f"1px solid {CARD_BORDER}",
},
"style_cell": {
"textAlign": "left",
"padding": "12px 16px",
"fontSize": "13px",
"fontFamily": FONT,
"border": "none",
"color": SLATE,
},
"style_data": {"backgroundColor": CARD_BG, "color": SLATE},
"style_data_conditional": [
{"if": {"row_index": "odd"}, "backgroundColor": "#1f1f23"}
],
"style_table": {
"borderRadius": "12px",
"overflow": "hidden",
"border": f"1px solid {CARD_BORDER}",
},
TABLE_HEADER: dict[str, str] = {
"backgroundColor": "rgba(24,24,27,0.8)",
"color": ACCENT,
"fontWeight": "600",
"fontSize": "13px",
"padding": "12px 16px",
"borderBottom": f"1px solid {CARD_BORDER}",
}
TABLE_CELL: dict[str, str] = {
"textAlign": "left",
"padding": "12px 16px",
"fontSize": "13px",
"fontFamily": FONT,
"border": "none",
"color": SLATE,
}
TABLE_DATA: dict[str, str] = {
"backgroundColor": "rgba(24,24,27,0.5)",
"color": SLATE,
}
TABLE_DATA_CONDITIONAL: list[dict[str, object]] = [
{"if": {"row_index": "odd"}, "backgroundColor": "rgba(31,31,35,0.6)"}
]
TABLE_WRAP: dict[str, str] = {
"borderRadius": "16px",
"overflow": "hidden",
"border": f"1px solid {CARD_BORDER}",
}

79
uv.lock
View file

@ -781,6 +781,11 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/2a/00/10b1f8b3885fc4add1853e9603af15c593fa0be20d37c158c4d811e868dc/dash-4.1.0-py3-none-any.whl", hash = "sha256:1af9f302bc14061061012cdb129b7e370d3604b12a7f730b252ad8e4966f01f7", size = 7232489, upload-time = "2026-03-23T20:39:40.658Z" },
]
[package.optional-dependencies]
cloud = [
{ name = "plotly-cloud" },
]
[[package]]
name = "dill"
version = "0.4.1"
@ -2160,6 +2165,22 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/90/ad/cba91b3bcf04073e4d1655a5c1710ef3f457f56f7d1b79dcc3d72f4dd912/plotly-6.7.0-py3-none-any.whl", hash = "sha256:ac8aca1c25c663a59b5b9140a549264a5badde2e057d79b8c772ae2920e32ff0", size = 9898444, upload-time = "2026-04-09T20:36:39.812Z" },
]
[[package]]
name = "plotly-cloud"
version = "0.2.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "dash" },
{ name = "httpx" },
{ name = "rich" },
{ name = "tomli" },
{ name = "tomli-w" },
]
sdist = { url = "https://files.pythonhosted.org/packages/37/70/aa91c6e3eedf7407954ce7842685cdb98b2a4af762c762e116dca30d559c/plotly_cloud-0.2.1.tar.gz", hash = "sha256:b73908887c9cfd10b18ebf9dd4ad572fecca30e5bd22da6319e107f7243bfaa2", size = 44713, upload-time = "2026-03-26T18:21:47.451Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/27/01/815de5dbfbdc3ce900252123b30119c6b2278f3f9ae66b592319c12314bd/plotly_cloud-0.2.1-py3-none-any.whl", hash = "sha256:537f5d1460274d32a37df77ee28181e5cd3d0d35e0419214d2d04bec823e9ca5", size = 50186, upload-time = "2026-03-26T18:21:46.338Z" },
]
[[package]]
name = "pluggy"
version = "1.6.0"
@ -2842,6 +2863,60 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/0e/28/a81d6ce9f4804818bd1231a9a6e4d56ea84ebbe8385c49591444f0234fa2/textual-8.2.3-py3-none-any.whl", hash = "sha256:5008ac581bebf1f6fa0520404261844a231e5715fdbddd10ca73916a3af48ca2", size = 724231, upload-time = "2026-04-05T09:12:48.747Z" },
]
[[package]]
name = "tomli"
version = "2.4.1"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/c1/ba/42f134a3fe2b370f555f44b1d72feebb94debcab01676bf918d0cb70e9aa/tomli-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c742f741d58a28940ce01d58f0ab2ea3ced8b12402f162f4d534dfe18ba1cd6a", size = 155924, upload-time = "2026-03-25T20:21:21.626Z" },
{ url = "https://files.pythonhosted.org/packages/dc/c7/62d7a17c26487ade21c5422b646110f2162f1fcc95980ef7f63e73c68f14/tomli-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7f86fd587c4ed9dd76f318225e7d9b29cfc5a9d43de44e5754db8d1128487085", size = 150018, upload-time = "2026-03-25T20:21:23.002Z" },
{ url = "https://files.pythonhosted.org/packages/5c/05/79d13d7c15f13bdef410bdd49a6485b1c37d28968314eabee452c22a7fda/tomli-2.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff18e6a727ee0ab0388507b89d1bc6a22b138d1e2fa56d1ad494586d61d2eae9", size = 244948, upload-time = "2026-03-25T20:21:24.04Z" },
{ url = "https://files.pythonhosted.org/packages/10/90/d62ce007a1c80d0b2c93e02cab211224756240884751b94ca72df8a875ca/tomli-2.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:136443dbd7e1dee43c68ac2694fde36b2849865fa258d39bf822c10e8068eac5", size = 253341, upload-time = "2026-03-25T20:21:25.177Z" },
{ url = "https://files.pythonhosted.org/packages/1a/7e/caf6496d60152ad4ed09282c1885cca4eea150bfd007da84aea07bcc0a3e/tomli-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5e262d41726bc187e69af7825504c933b6794dc3fbd5945e41a79bb14c31f585", size = 248159, upload-time = "2026-03-25T20:21:26.364Z" },
{ url = "https://files.pythonhosted.org/packages/99/e7/c6f69c3120de34bbd882c6fba7975f3d7a746e9218e56ab46a1bc4b42552/tomli-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5cb41aa38891e073ee49d55fbc7839cfdb2bc0e600add13874d048c94aadddd1", size = 253290, upload-time = "2026-03-25T20:21:27.46Z" },
{ url = "https://files.pythonhosted.org/packages/d6/2f/4a3c322f22c5c66c4b836ec58211641a4067364f5dcdd7b974b4c5da300c/tomli-2.4.1-cp312-cp312-win32.whl", hash = "sha256:da25dc3563bff5965356133435b757a795a17b17d01dbc0f42fb32447ddfd917", size = 98141, upload-time = "2026-03-25T20:21:28.492Z" },
{ url = "https://files.pythonhosted.org/packages/24/22/4daacd05391b92c55759d55eaee21e1dfaea86ce5c571f10083360adf534/tomli-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:52c8ef851d9a240f11a88c003eacb03c31fc1c9c4ec64a99a0f922b93874fda9", size = 108847, upload-time = "2026-03-25T20:21:29.386Z" },
{ url = "https://files.pythonhosted.org/packages/68/fd/70e768887666ddd9e9f5d85129e84910f2db2796f9096aa02b721a53098d/tomli-2.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:f758f1b9299d059cc3f6546ae2af89670cb1c4d48ea29c3cacc4fe7de3058257", size = 95088, upload-time = "2026-03-25T20:21:30.677Z" },
{ url = "https://files.pythonhosted.org/packages/07/06/b823a7e818c756d9a7123ba2cda7d07bc2dd32835648d1a7b7b7a05d848d/tomli-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36d2bd2ad5fb9eaddba5226aa02c8ec3fa4f192631e347b3ed28186d43be6b54", size = 155866, upload-time = "2026-03-25T20:21:31.65Z" },
{ url = "https://files.pythonhosted.org/packages/14/6f/12645cf7f08e1a20c7eb8c297c6f11d31c1b50f316a7e7e1e1de6e2e7b7e/tomli-2.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb0dc4e38e6a1fd579e5d50369aa2e10acfc9cace504579b2faabb478e76941a", size = 149887, upload-time = "2026-03-25T20:21:33.028Z" },
{ url = "https://files.pythonhosted.org/packages/5c/e0/90637574e5e7212c09099c67ad349b04ec4d6020324539297b634a0192b0/tomli-2.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7f2c7f2b9ca6bdeef8f0fa897f8e05085923eb091721675170254cbc5b02897", size = 243704, upload-time = "2026-03-25T20:21:34.51Z" },
{ url = "https://files.pythonhosted.org/packages/10/8f/d3ddb16c5a4befdf31a23307f72828686ab2096f068eaf56631e136c1fdd/tomli-2.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f3c6818a1a86dd6dca7ddcaaf76947d5ba31aecc28cb1b67009a5877c9a64f3f", size = 251628, upload-time = "2026-03-25T20:21:36.012Z" },
{ url = "https://files.pythonhosted.org/packages/e3/f1/dbeeb9116715abee2485bf0a12d07a8f31af94d71608c171c45f64c0469d/tomli-2.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d312ef37c91508b0ab2cee7da26ec0b3ed2f03ce12bd87a588d771ae15dcf82d", size = 247180, upload-time = "2026-03-25T20:21:37.136Z" },
{ url = "https://files.pythonhosted.org/packages/d3/74/16336ffd19ed4da28a70959f92f506233bd7cfc2332b20bdb01591e8b1d1/tomli-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51529d40e3ca50046d7606fa99ce3956a617f9b36380da3b7f0dd3dd28e68cb5", size = 251674, upload-time = "2026-03-25T20:21:38.298Z" },
{ url = "https://files.pythonhosted.org/packages/16/f9/229fa3434c590ddf6c0aa9af64d3af4b752540686cace29e6281e3458469/tomli-2.4.1-cp313-cp313-win32.whl", hash = "sha256:2190f2e9dd7508d2a90ded5ed369255980a1bcdd58e52f7fe24b8162bf9fedbd", size = 97976, upload-time = "2026-03-25T20:21:39.316Z" },
{ url = "https://files.pythonhosted.org/packages/6a/1e/71dfd96bcc1c775420cb8befe7a9d35f2e5b1309798f009dca17b7708c1e/tomli-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:8d65a2fbf9d2f8352685bc1364177ee3923d6baf5e7f43ea4959d7d8bc326a36", size = 108755, upload-time = "2026-03-25T20:21:40.248Z" },
{ url = "https://files.pythonhosted.org/packages/83/7a/d34f422a021d62420b78f5c538e5b102f62bea616d1d75a13f0a88acb04a/tomli-2.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:4b605484e43cdc43f0954ddae319fb75f04cc10dd80d830540060ee7cd0243cd", size = 95265, upload-time = "2026-03-25T20:21:41.219Z" },
{ url = "https://files.pythonhosted.org/packages/3c/fb/9a5c8d27dbab540869f7c1f8eb0abb3244189ce780ba9cd73f3770662072/tomli-2.4.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fd0409a3653af6c147209d267a0e4243f0ae46b011aa978b1080359fddc9b6cf", size = 155726, upload-time = "2026-03-25T20:21:42.23Z" },
{ url = "https://files.pythonhosted.org/packages/62/05/d2f816630cc771ad836af54f5001f47a6f611d2d39535364f148b6a92d6b/tomli-2.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a120733b01c45e9a0c34aeef92bf0cf1d56cfe81ed9d47d562f9ed591a9828ac", size = 149859, upload-time = "2026-03-25T20:21:43.386Z" },
{ url = "https://files.pythonhosted.org/packages/ce/48/66341bdb858ad9bd0ceab5a86f90eddab127cf8b046418009f2125630ecb/tomli-2.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:559db847dc486944896521f68d8190be1c9e719fced785720d2216fe7022b662", size = 244713, upload-time = "2026-03-25T20:21:44.474Z" },
{ url = "https://files.pythonhosted.org/packages/df/6d/c5fad00d82b3c7a3ab6189bd4b10e60466f22cfe8a08a9394185c8a8111c/tomli-2.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01f520d4f53ef97964a240a035ec2a869fe1a37dde002b57ebc4417a27ccd853", size = 252084, upload-time = "2026-03-25T20:21:45.62Z" },
{ url = "https://files.pythonhosted.org/packages/00/71/3a69e86f3eafe8c7a59d008d245888051005bd657760e96d5fbfb0b740c2/tomli-2.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7f94b27a62cfad8496c8d2513e1a222dd446f095fca8987fceef261225538a15", size = 247973, upload-time = "2026-03-25T20:21:46.937Z" },
{ url = "https://files.pythonhosted.org/packages/67/50/361e986652847fec4bd5e4a0208752fbe64689c603c7ae5ea7cb16b1c0ca/tomli-2.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ede3e6487c5ef5d28634ba3f31f989030ad6af71edfb0055cbbd14189ff240ba", size = 256223, upload-time = "2026-03-25T20:21:48.467Z" },
{ url = "https://files.pythonhosted.org/packages/8c/9a/b4173689a9203472e5467217e0154b00e260621caa227b6fa01feab16998/tomli-2.4.1-cp314-cp314-win32.whl", hash = "sha256:3d48a93ee1c9b79c04bb38772ee1b64dcf18ff43085896ea460ca8dec96f35f6", size = 98973, upload-time = "2026-03-25T20:21:49.526Z" },
{ url = "https://files.pythonhosted.org/packages/14/58/640ac93bf230cd27d002462c9af0d837779f8773bc03dee06b5835208214/tomli-2.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:88dceee75c2c63af144e456745e10101eb67361050196b0b6af5d717254dddf7", size = 109082, upload-time = "2026-03-25T20:21:50.506Z" },
{ url = "https://files.pythonhosted.org/packages/d5/2f/702d5e05b227401c1068f0d386d79a589bb12bf64c3d2c72ce0631e3bc49/tomli-2.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:b8c198f8c1805dc42708689ed6864951fd2494f924149d3e4bce7710f8eb5232", size = 96490, upload-time = "2026-03-25T20:21:51.474Z" },
{ url = "https://files.pythonhosted.org/packages/45/4b/b877b05c8ba62927d9865dd980e34a755de541eb65fffba52b4cc495d4d2/tomli-2.4.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:d4d8fe59808a54658fcc0160ecfb1b30f9089906c50b23bcb4c69eddc19ec2b4", size = 164263, upload-time = "2026-03-25T20:21:52.543Z" },
{ url = "https://files.pythonhosted.org/packages/24/79/6ab420d37a270b89f7195dec5448f79400d9e9c1826df982f3f8e97b24fd/tomli-2.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7008df2e7655c495dd12d2a4ad038ff878d4ca4b81fccaf82b714e07eae4402c", size = 160736, upload-time = "2026-03-25T20:21:53.674Z" },
{ url = "https://files.pythonhosted.org/packages/02/e0/3630057d8eb170310785723ed5adcdfb7d50cb7e6455f85ba8a3deed642b/tomli-2.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d8591993e228b0c930c4bb0db464bdad97b3289fb981255d6c9a41aedc84b2d", size = 270717, upload-time = "2026-03-25T20:21:55.129Z" },
{ url = "https://files.pythonhosted.org/packages/7a/b4/1613716072e544d1a7891f548d8f9ec6ce2faf42ca65acae01d76ea06bb0/tomli-2.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:734e20b57ba95624ecf1841e72b53f6e186355e216e5412de414e3c51e5e3c41", size = 278461, upload-time = "2026-03-25T20:21:56.228Z" },
{ url = "https://files.pythonhosted.org/packages/05/38/30f541baf6a3f6df77b3df16b01ba319221389e2da59427e221ef417ac0c/tomli-2.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8a650c2dbafa08d42e51ba0b62740dae4ecb9338eefa093aa5c78ceb546fcd5c", size = 274855, upload-time = "2026-03-25T20:21:57.653Z" },
{ url = "https://files.pythonhosted.org/packages/77/a3/ec9dd4fd2c38e98de34223b995a3b34813e6bdadf86c75314c928350ed14/tomli-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:504aa796fe0569bb43171066009ead363de03675276d2d121ac1a4572397870f", size = 283144, upload-time = "2026-03-25T20:21:59.089Z" },
{ url = "https://files.pythonhosted.org/packages/ef/be/605a6261cac79fba2ec0c9827e986e00323a1945700969b8ee0b30d85453/tomli-2.4.1-cp314-cp314t-win32.whl", hash = "sha256:b1d22e6e9387bf4739fbe23bfa80e93f6b0373a7f1b96c6227c32bef95a4d7a8", size = 108683, upload-time = "2026-03-25T20:22:00.214Z" },
{ url = "https://files.pythonhosted.org/packages/12/64/da524626d3b9cc40c168a13da8335fe1c51be12c0a63685cc6db7308daae/tomli-2.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2c1c351919aca02858f740c6d33adea0c5deea37f9ecca1cc1ef9e884a619d26", size = 121196, upload-time = "2026-03-25T20:22:01.169Z" },
{ url = "https://files.pythonhosted.org/packages/5a/cd/e80b62269fc78fc36c9af5a6b89c835baa8af28ff5ad28c7028d60860320/tomli-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:eab21f45c7f66c13f2a9e0e1535309cee140182a9cdae1e041d02e47291e8396", size = 100393, upload-time = "2026-03-25T20:22:02.137Z" },
{ url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" },
]
[[package]]
name = "tomli-w"
version = "1.2.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/19/75/241269d1da26b624c0d5e110e8149093c759b7a286138f4efd61a60e75fe/tomli_w-1.2.0.tar.gz", hash = "sha256:2dd14fac5a47c27be9cd4c976af5a12d87fb1f0b4512f81d69cce3b35ae25021", size = 7184, upload-time = "2025-01-15T12:07:24.262Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/c7/18/c86eb8e0202e32dd3df50d43d7ff9854f8e0603945ff398974c1d91ac1ef/tomli_w-1.2.0-py3-none-any.whl", hash = "sha256:188306098d013b691fcadc011abd66727d3c414c571bb01b1a174ba8c983cf90", size = 6675, upload-time = "2025-01-15T12:07:22.074Z" },
]
[[package]]
name = "tomlkit"
version = "0.14.0"
@ -2993,13 +3068,13 @@ name = "unstructured-report"
version = "0.1.0"
source = { virtual = "reports/unstructured" }
dependencies = [
{ name = "dash" },
{ name = "dash", extra = ["cloud"] },
{ name = "plotly" },
]
[package.metadata]
requires-dist = [
{ name = "dash", specifier = ">=4.1" },
{ name = "dash", extras = ["cloud"], specifier = ">=4.1" },
{ name = "plotly", specifier = ">=6.7" },
]