Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Test coverage map

Where the tests are, where they are thin, and what to write next. The page is the answer to “which code can break without a test noticing?” – it is meant to be updated, not admired. Whether the tests check what they run is the job of mutation testing. Last measured: 2026-11-06, from the CI job coverage on main at b4cf014 (release 0.2.0; it contains #89–#95 and the proofing tests).

Method

  • Lines of code – wc -l of every file under src/ (blank lines and comments included) and desktop/src/.

  • Unit tests – the number of #[test] / #[tokio::test] functions in the module’s own file (src/simmesh/tests.rs belongs to simmesh.rs).

  • Integration tests – tests/*.rs talk to the real router (HTTP), so the routes and services they reach are mapped by what the test asserts, not by imports. The module table names only the test files that use a module directly (teamcraft::module::…); the area tables list the test files that drive the code through the API or the web UI.

  • Measured line coverage – cargo llvm-cov in the CI job coverage: the complete test suite (unit, integration and database tests) against PostgreSQL 16 with the client tools. Its per-file summary is the source of the tables below. Locally, without a database, a quick check is:

    cargo install cargo-llvm-cov --locked && rustup component add llvm-tools-preview
    cargo llvm-cov --lib --summary-only            # unit tests only
    cargo llvm-cov --summary-only --no-fail-fast   # every test that runs without PostgreSQL
    cargo llvm-cov --html                          # report in target/llvm-cov/html
    

    Without PostgreSQL the database tests skip themselves, so services/*, web/* and api/* look uncovered locally although CI exercises them. Inline #[cfg(test)] code counts as covered lines, so the percentage of a module with a large test section is too high – the number of missed lines is the honest figure.

  • Ranking – risk × thinness. Risk: untrusted input (file parsers, HTTP bodies, tokens), data integrity (multi-row mutations, vault, backup, migrations, imports, uploads), size of the code. Thinness: missed lines, and whether failure paths (refusal, conflict, rollback, damaged input) are tested at all and not only the happy path.

Coverage in CI

The PostgreSQL 18 leg of the job tests in .github/workflows/ci.yml (until 2026-11-07 a separate job coverage) runs cargo llvm-cov over the complete test suite with PostgreSQL 18 and the client tools, prints the per-file summary into the job summary and uploads the HTML report (coverage-html, 14 days) as an artifact.

The floor. Since 2026-11-06 the job fails when the total line coverage drops below the value in .github/coverage-floor. The last runs on main were 91.48 % (6b7c95a), 91.52 % (e513b37), 91.53 % (5a39a85) and 91.65 % (0fcfa26, b4cf014): the variation between runs is about a tenth of a point, so the floor is the current value minus half a percentage point – 91.1 %, about 280 missed lines more than today. Raise it when the coverage has grown for good; lowering it is a deliberate change of that file in the pull request, with the reason in its description.

Areas

Missed lines / lines and line coverage from CI (b4cf014).

AreaCodeTestsCI: missed / linesHTTP / integration tests
File parsers (mesh*, simmesh, stepbom, swpart, nxpart, thumbnail, cadrefs, bomtable, textindex, cadformat, shape, pdftext, resultscan)10.1k counted linesunit tests per module; property tests (#94)361 / 10,058 – 96.4 %cad_fixtures (real NIST files), uploads, web_ui, parser_robustness, parser_corpus, preview_limits
services/* (business logic, the only writer)17.0k counted linesunit tests in a third of the modules1,165 / 16,999 – 93.1 %api_flow, read_permissions, change_orders, change_requests, concurrency, uploads, webhooks, structure, numbering_and_watches, release_readiness, reviewers, audit_and_vault, interchange, working_folder, similar_parts, attributes, search_listing, scale, bom_performance, import_atomicity, import_proofing, service_refusals, migrations, atomic_processes, result_values, result_proposals, assistant_threads, agent_tools
web/* (HTML handlers)5.6k counted lines–891 / 5,613 – 84.1 %web_ui, the feature tests that use the forms, no_unchecked_in_handlers
api/* (REST handlers)2.9k counted lines–305 / 2,878 – 89.4 %api_flow and the feature tests, range_downloads
domain/*, config.rs, util.rs, error.rs3.1k counted linesunit and property tests87 / 3,068 – 97.2 %all of them; domain_and_vault
auth.rs, oidc.rs0.6k counted lines10 unit191 / 649 – 70.6 % (oidc.rs 53.5 %)api_flow, read_permissions (tokens, sessions), oidc_flow (SSO against a fake provider, session and PAT lifetime; the CI numbers predate it)
vault.rs, backup.rs, db.rs1.1k counted linesunit tests in each101 / 1,148 – 91.2 %audit_and_vault, domain_and_vault, uploads, backup_restore, backup_errors, backup_proofing, migrations
webhooks.rs, delivery.rs, notify.rs1.0k counted linesunit tests in each129 / 971 – 86.7 % (notify.rs 26 %)webhooks, webhook_ssrf, api_flow (e-mail outbox), atomic_processes; no test against a real SMTP/Mattermost server
assistant.rs, llm/*, mcp/*5.2k counted linesunit tests in each306 / 5,236 – 94.2 %assistant, assistant_threads, mcp, agent_tools, read_permissions
main.rs, lib.rs (CLI, router)0.8k counted lines3 unit533 / 756 – 29.5 %the CLI runs only in the CLI smoke test of the tests job, which the coverage job does not measure
Desktop (desktop/src, own crate, not measured)9.1k lines72 unit–none (CI runs the desktop tests on Linux only)

Feature to test map

Every file in tests/ (2026-11-06, ab1abd9), grouped by the feature it pins. The count is the number of #[test] / #[tokio::test] functions in the file (grep -c "#\[test\]\|#\[tokio::test\]"); it is a size hint, not a measure of quality. The CI numbers in the tables above are still from b4cf014.

FeatureTest files (count)
REST workflow, end to endapi_flow (24), atomic_processes (10), service_refusals (6)
Items, numbering, listsnumbering_and_watches (1), search_listing (1), working_folder (1)
Change orders and releasechange_orders (6), release_readiness (2)
Engineering change requestschange_requests (4), change_request_paths (1), request_digests (1)
Files, vault, uploads, downloadsuploads (11), range_downloads (1), domain_and_vault (10), audit_and_vault (3), concurrency (6), preview_limits (5), folder_import (2)
Product structure and BOMstructure (4), bom_performance (4), bom_tree_view (2), insights (3), interchange (2)
Mass propertiesmass_properties (3; unit tests in massprops and services::mass_properties)
BOM importimport_atomicity (4), import_proofing (7)
CAD readers, previews, resultscad_fixtures (13), parser_robustness (16), parser_corpus (2), step_export_names (2), similar_parts (2), result_values (4), result_proposals (3)
Custom attributesattributes (2)
Suggested reviewersreviewers (1)
Login, SSO, access controloidc_flow (9), read_permissions (8), no_unchecked_in_handlers (2), web_security (7)
Outgoing webhookswebhooks (8), webhook_ssrf (4), web_webhooks (3)
Error notificationsnotify (1)
Backup, restore, migrationsbackup_restore (1), backup_errors (7), backup_proofing (5), migrations (6)
Assistant, MCP, agent toolsassistant (3), assistant_threads (3), agent_tools (4), mcp (3), mcp_contract (2)
Web UIweb_ui (16)
Command linecli (4)
Desktop app and server versionsdesktop_compat (4, the version handshake rules, no database)
Architecture rulesarchitecture_guards (7, reads the sources, no database)
Scale checkscale.rs (0 active, one #[ignore] test; scale/seed.sql)
Shared helpers and datacommon/mod.rs (test database per test), fixtures/ (NIST CAD files, v0.1.0 seed)

Unit tests in src/, by feature (count of test functions in the module or its tests file):

FeatureModules (count)
CAD and mesh readersmesh (13), mesh/p21 (5), mesh/step (4), mesh/tessellated (6), simmesh (19), shape (9), stepbom (13), swpart (14), nxpart (7), thumbnail (12), bomtable (20), cadrefs (21), cadformat (19), textindex (9), pdftext (5), resultscan (9), fuzz_harness (2)
Previews, pages, HTTP rangespreview (5), httprange (5), pagecontext (5), assets (8), templates (4), templates/accessibility (1)
Pure rules and configdomain/mod (38), models (10), config (16), util (5)
Vault, backup, databasevault (4), backup (9), db (1)
Services with unit testsservices/bom (15), services/bom_compare (4), services/imports (6), services/readiness (6), services/simulations (5), services/requests/tests (5), services/uploads (5), services/files (3), services/impacts (3), services/request_digests (3), services/webhooks (4), services/users (2), services/checkouts (2), services/reviewers (2), services/notifications (2), services/assistant_threads (2), services/desktop (2), services/similar (1), services/result_proposals (1), services/personal (1), services/access (1)
Web, auth, integrationsweb/mod (2), auth (8), oidc (4), webhooks (9), delivery (4), notify (4), assistant (12), mcp/mod (2), mcp/tools/tests (14), llm/anthropic (5), llm/http (3), llm/openai (8), main (3)

Services and pages with no unit test (services/items, changes, revisions, interchange, attributes, insights, projects, explorer, references, workset, save_as, package, stats; every web/* and api/* module): they are covered through the HTTP tests above only.

Gaps

Judged by the test counts above, the missed lines of the CI table and whether a failure path has a test. Ordered by risk.

  1. Vault explorer (services/explorer.rs, web/explorer.rs): no test file of its own and no unit test; only api_flow, web_ui and scale touch it.
  2. Projects and self-service groups (services/projects.rs, 53 of 558 lines missed): no own file and no unit test; the failure paths (a refused change by a non-manager, a removed member keeping access) are the ones to pin, in a new projects file.
  3. Simulations (services/simulations.rs 85 missed, web/simulations.rs 74.6 %, api/simulations.rs 90.7 %): five unit tests and no own file.
  4. Change requests triage (services/requests.rs, 162 missed; web/requests.rs, 131 missed at 75.1 %): one integration test for the paths, the triage pages are untested except through web_ui.
  5. Admin and account pages (web/admin.rs 74.3 %, 110 missed; web/account.rs 83.4 %; web/personal.rs 80.7 %): no own file, no unit test.
  6. Attributes and interchange (2 integration tests each, no unit test; web/attributes.rs 75 %, web/interchange.rs 88 %): the failure paths to add are a refused edit by a non-administrator and a conflicting alternate.
  7. Search, watches, reviewers (1 to 2 tests each): the failure paths to add are a filter that must not reveal a restricted item and a watch on a removed item.
  8. Identity and notifications with real servers: oidc.rs 53.5 % (CI), notify.rs 26 % (CI, before tests/notify.rs), no test against a real SMTP or Mattermost server; services/users.rs 72.9 % (187 missed) for deactivation and token revocation of a whole account.
  9. Range downloads (tests/range_downloads.rs, 1 test): httprange is at 100 % line coverage, but the file-level test count is the thinnest of the download path; the failure path to add is a resume whose If-Range no longer matches the stored object.

Next tests come from these items in the order above, failure path first (refusal, conflict, rollback).

Top 15: the thinnest high-risk spots

Ranked by risk × thinness on 2026-11-05; the last two columns are today’s state.

#SpotWhy it is riskyTests that pin itCI missed / linesOpen
1services/imports.rs + bomtable/stepbom import pathMulti-row write from untrusted tables; one transaction must holdimport_atomicity (refusals, injected failure, retry, no duplicates), import_proofing (7), damage tests62 / 860–
2db.rs + migrations/A bad upgrade destroys every installationmigrations (6): numbering and the known gap, every migration one at a time ending at the fresh schema (constraints, indexes, triggers, functions), twice a no-op, checksum rule, a failed migration blocks, a v0.1.0 database with data upgrades without loss (#91)16 / 105–
3backup.rsA restore is the last line of defencebackup_errors (7), backup_proofing (5, #93): corrupt or missing objects refuse the backup and nothing is left, a v0.1.0 backup is restored and migrated, a failing --force leaves database and vault untouched, credentials, large objects, preview cache55 / 719–
4services/changes.rsRelease of a change order flips many revisions at onceatomic_processes (#92): an injected failure (error or lost connection) at the second revision, the notifications or the webhook deliveries leaves nothing; two releases at once release once85 / 1,223–
5services/files.rs, services/uploads.rsCheck-in, versions, chunked uploads: data loss on racesatomic_processes: failure between the versions and the lock release, upload finish repeatable; two check-ins at once give one winner; concurrency, uploads, range_downloads45 / 935, 30 / 457–
6services/items.rs, revisions.rsCreation, numbering, lifecycleservice_refusals, domain_and_vault, atomic_processes (12 parallel creations, the same number twice)54 / 724, 4 / 490–
7services/bom.rsCycles and quantities corrupt every roll-up10 unit, structure, service_refusals14 / 1,004–
8services/checkouts.rsThe lock is the integrity mechanism of the vaultconcurrency10 / 240–
9services/users.rs, auth.rs, oidc.rsSessions, tokens, SSO – untrusted inputunit tests, api_flow, read_permissions, oidc_flow (8, fake identity provider in the test process): a good login provisions the account with the mapped role; a missing, forged or expired state, a replayed callback, an error from the provider, a wrong nonce, an old exp, another aud or iss, no subject sign nobody in; a PKCE mismatch and a used code are a login error (fixed, below), a wrong client secret stays an internal error; ID token signatures are not checked by design (pinned); sessions and PATs end on expiry, sign-out / revocation (owner or admin, audited) and deactivation187 / 690, 11 / 262, 180 / 387 (before oidc_flow)– (a plain-HTTP issuer, below)
10webhooks.rs + services/webhooks.rs (SSRF guard, signing)Server-side requests to configurable URLsunit tests of the address rules (internal_addresses, default_policy_blocks_internal_targets, allow_list_restricts_and_trusts_hosts), HMAC vectors, webhooks, atomic_processes, webhook_ssrf (4) and every_connection_checks_the_answer_it_uses: a name that passes when saved and resolves to loopback, cloud metadata, an IPv4-mapped or unique-local address when used (DNS rebinding) is refused at connect time and every attempt resolves anew; mixed answers keep only public addresses; localhost via the system resolver and a stored IP literal are refused; a listed host is delivered (resolution injectable: Dispatcher::with_lookup)43 / 582, 25 / 679–
11mesh.rs readersUntrusted bytes, big allocationsparser_robustness, parser_corpus, fuzz targets108 / 1,535–
12simmesh.rs (VTK/VTU/FRD)Untrusted, hand-written parsing19 unit, damage tests81 / 1,465an FRD sample in the damage tests
13swpart.rs, nxpart.rs, thumbnail.rsOffsets, lengths, decompression bombsunit tests, NIST files, damage tests8 / 657, 3 / 262, 15 / 543a SOLIDWORKS container built by hand
14stepbom.rs, bomtable.rs, cadrefs.rs, textindex.rs, cadformat.rsUntrusted text and spreadsheets; heuristicunit tests, damage tests5 / 655, 10 / 747, 2 / 442, 2 / 200, 4 / 771–
15vault.rsContent-addressed storage: the bytes of every revisiondomain_and_vault; since #93 every backup hashes every object and requires every referenced one30 / 324–

Thin, outside the top 15: services/requests.rs (162 of 1,587 lines missed), web/requests.rs, web/simulations.rs, web/attributes.rs and web/admin.rs (a quarter of their lines missed each), desktop/src/commands.rs. Covered since (the numbers in the table below are from before, until the next coverage run):

  • notify.rs (48 of 65 missed) – tests/notify.rs: an internal error of a request reaches a local stand-in for Mattermost, further errors within the minute are only counted, a receiver answering 500 changes nothing; unit tests for the rate limit (with the clock passed in) and the message.
  • services/insights.rs (83 of 187) – tests/insights.rs: every kind of BOM issue once per line, the released rule, a cycle, a hidden line reported without its number, an empty BOM, the cap of 500 findings; duplicate files with and without a scope, for a reader and an administrator.
  • web/webhooks.rs (48 of 216) – tests/web_webhooks.rs: every page and action for a non-administrator and from another site, the form rules (including internal addresses as IP literals), test delivery, retry (409 for a sent delivery and an inactive webhook), secret rotation, deletion.

Found while writing the tests

  • Fixed (2026-11-05) – mesh::read("gltf", …) panicked (index out of bounds inside gltf-json) for a primitive whose POSITION points past the accessor list. The library call is now wrapped in catch_unwind and yields an error; regression test gltf_accessor_index_out_of_range_is_an_error.
  • Fixed (#93) – backup::backup copied vault objects without checking their hash and did not require the objects the database refers to; a corrupt or missing object was found only at restore time. The backup now refuses both and removes what it wrote.
  • Fixed (2026-11-06) – the commands of the CLI wrote their log lines (e.g. the audit line of user create) to standard output, between their own output. They now log to standard error; the server still logs to standard output (tests/cli.rs).
  • No bug (#92) – every multi-row mutation covered by atomic_processes already ran in one transaction; a mutation check (a check-in split into two transactions) makes those tests fail.
  • Fixed – a login code the identity provider refused (invalid_grant: a code already used or expired, or a PKCE verifier that does not match – an intercepted code) ended in a 500 page and an incident report. It is a failed login attempt, not a server fault: it is now the login page with a 400 and “the identity provider refused the login code”; other token endpoint errors (invalid_client, a 5xx, no connection) stay internal errors because the administrator has to act. Regression tests a_pkce_mismatch_or_a_used_code_is_refused_by_the_provider and a_misconfigured_client_stays_a_server_error.
  • Observation, decision left open – ID token signatures are not verified; that rests on the token coming straight from the token endpoint over TLS (OIDC Core 3.1.3.7 step 6). TEAMCRAFT_OIDC_ISSUER_URL also accepts http:// (an internal identity provider without TLS); then nothing protects the token on its way. Refusing http:// outside of localhost, or verifying the signature against the provider’s JWKS when the issuer is plain HTTP, would close that – not changed here because it can break existing installations.
  • Fixed (2026-11-06) – insights::duplicate_files with a revision of a group the reader may not see answered with the visible copies of its files (only the MCP tool checked the revision first). The service now answers “not found” itself (tests/insights.rs).
  • No bug – a webhook URL with a host name such as localhost is saved: only IP literals are checked then, the name when the connection is made (tests/webhook_ssrf.rs).
  • No bug – the SSRF check at connect time: the resolver filters every answer for each new connection; a mutation that drops the filter fails the four resolver-based tests.

What to write next

  1. services/requests.rs and the thin web pages (web/requests.rs, web/simulations.rs, web/attributes.rs, web/admin.rs).
  2. FRD sample and a SOLIDWORKS container built by hand in the damage tests.
  3. Done: the CLI (main.rs, 511 of 643 lines missed) – tests/cli.rs runs the real binary against a test database (migrate, user, vault check, rescan-references, assistant check, healthcheck, preview-mesh, text-extract, the mcp bridge), which the coverage job measures; serve, backup/restore (see backup_restore) and vault signatures still run only elsewhere.
  4. Done: atomicity under an injected failure (#92), a floor for the CI coverage job (.github/coverage-floor), OIDC failure paths and the SSRF check at connect time (oidc_flow, webhook_ssrf), cargo fuzz targets (see Fuzzing the file readers), error notifications, BOM health check and duplicates, webhook pages (notify, insights, web_webhooks).

Per module

From the CI job coverage on b4cf014. Integration names the test files that use the module by name (teamcraft::…); the HTTP-driven coverage of services/*, web/* and api/* is in the area table above.

ModuleLOCUnit testsCI missed / linesLine coverageIntegration (direct use)
api/bom_api.rs26107 of 19196.3 %–
api/change_requests.rs425046 of 30685.0 %–
api/changes_api.rs228018 of 17989.9 %–
api/concurrency_api.rs6401 of 3697.2 %–
api/files_api.rs13903 of 11497.4 %–
api/interchange_api.rs15602 of 10598.1 %–
api/items_api.rs46803 of 34299.1 %–
api/mod.rs6990157 of 53070.4 %–
api/notifications_api.rs14201 of 10999.1 %–
api/personal.rs222017 of 14388.1 %–
api/projects_api.rs13501 of 9198.9 %–
api/references_api.rs14900 of 103100.0 %–
api/simulations.rs406028 of 30190.7 %–
api/uploads_api.rs256017 of 18991.0 %–
api/webhooks.rs20104 of 13997.1 %–
assets.rs41382 of 28099.3 %web_ui
assistant.rs20941271 of 160895.6 %agent_tools, read_permissions, result_proposals
auth.rs410611 of 26295.8 %api_flow, bom_performance
backup.rs961955 of 71992.4 %backup_errors, backup_proofing, backup_restore
bomtable.rs9781910 of 74798.7 %api_flow, import_proofing, parser_robustness
cadformat.rs1372194 of 77199.5 %cad_fixtures, parser_robustness
cadrefs.rs629182 of 44299.5 %cad_fixtures, parser_robustness
config.rs15271647 of 110895.8 %api_flow, backup_errors, backup_proofing +3
db.rs185116 of 10584.8 %api_flow, backup_proofing, migrations
delivery.rs477438 of 32488.3 %api_flow, read_permissions
domain/attributes.rs28908 of 18495.7 %–
domain/changes.rs33604 of 14797.3 %–
domain/concurrency.rs17306 of 9793.8 %–
domain/items.rs32400 of 209100.0 %–
domain/lifecycle.rs15500 of 66100.0 %–
domain/mod.rs1021387 of 66398.9 %api_flow, assistant, assistant_threads +28
domain/notifications.rs15601 of 6498.4 %–
domain/references.rs8800 of 32100.0 %–
domain/roles.rs9605 of 3987.2 %–
domain/simulations.rs13000 of 74100.0 %–
domain/skins.rs17701 of 5798.2 %–
domain/validation.rs22001 of 16799.4 %–
error.rs13306 of 5789.5 %change_orders, preview_limits, read_permissions
fuzz_harness.rs157210 of 6384.1 %parser_corpus
httprange.rs17650 of 91100.0 %–
lib.rs233022 of 11380.5 %–
llm/anthropic.rs38954 of 28998.6 %–
llm/http.rs20434 of 15397.4 %–
llm/mod.rs30207 of 9392.5 %–
llm/openai.rs550811 of 42597.4 %–
main.rs10323511 of 64320.5 %–
mcp/mod.rs29127 of 16795.8 %read_permissions
mcp/tools.rs339514202 of 250191.9 %read_permissions
mesh.rs193312108 of 153593.0 %cad_fixtures, parser_robustness, web_ui
mesh/p21.rs672526 of 45994.3 %–
mesh/step.rs529417 of 35195.2 %–
mesh/tessellated.rs43869 of 35997.5 %–
models.rs868100 of 313100.0 %–
notify.rs116248 of 6526.2 %–
nxpart.rs39773 of 26298.9 %parser_robustness
oidc.rs4924180 of 38753.5 %–
pagecontext.rs40054 of 27298.5 %–
pdftext.rs321536 of 24185.1 %–
preview.rs9415111 of 65182.9 %cad_fixtures, preview_limits
resultscan.rs863915 of 60097.5 %–
services/access.rs15910 of 61100.0 %–
services/assistant.rs470053 of 35985.2 %–
services/assistant_threads.rs26421 of 17599.4 %assistant_threads
services/attributes.rs307023 of 25190.8 %–
services/audit.rs32202 of 24299.2 %read_permissions
services/bom.rs14351014 of 100498.6 %–
services/bom_compare.rs60148 of 38597.9 %–
services/changes.rs1393085 of 122393.0 %api_flow, change_orders, read_permissions
services/checkouts.rs376210 of 24095.8 %concurrency
services/desktop.rs23421 of 14699.3 %web_ui
services/explorer.rs16400 of 80100.0 %–
services/files.rs1219345 of 93595.2 %api_flow, backup_proofing
services/impacts.rs1173324 of 78696.9 %–
services/imports.rs1197662 of 86092.8 %–
services/insights.rs276083 of 18755.6 %–
services/interchange.rs708020 of 49696.0 %–
services/items.rs1023054 of 72492.5 %api_flow, bom_performance, read_permissions
services/mod.rs8900 of 27100.0 %api_flow, assistant_threads, backup_proofing +7
services/notifications.rs83823 of 54499.4 %read_permissions
services/package.rs18104 of 12196.7 %–
services/personal.rs16913 of 12297.5 %–
services/projects.rs688053 of 55890.5 %api_flow, read_permissions
services/readiness.rs62764 of 42399.1 %–
services/references.rs506024 of 35293.2 %–
services/requests.rs19425162 of 158789.8 %read_permissions
services/result_proposals.rs424116 of 30394.7 %–
services/result_templates.rs234015 of 19692.3 %–
services/reviewers.rs446212 of 18893.6 %–
services/revisions.rs59404 of 49099.2 %–
services/save_as.rs17303 of 13097.7 %–
services/similar.rs677143 of 43490.1 %–
services/simulations.rs1769585 of 132693.6 %–
services/stats.rs4400 of 26100.0 %–
services/uploads.rs644530 of 45793.4 %uploads
services/users.rs8362187 of 69072.9 %api_flow, backup_proofing, migrations +2
services/webhooks.rs915425 of 67996.3 %–
services/workset.rs30407 of 19296.4 %–
shape.rs1031920 of 77197.4 %cad_fixtures
simmesh.rs19681981 of 146594.5 %–
stepbom.rs865135 of 65599.2 %import_proofing, parser_robustness
swpart.rs978148 of 65798.8 %parser_robustness
templates.rs161536 of 126399.5 %–
textindex.rs30292 of 20099.0 %parser_robustness
thumbnail.rs7231215 of 54397.2 %cad_fixtures, parser_robustness
util.rs15651 of 10499.0 %api_flow, web_ui
vault.rs434430 of 32490.7 %–
web/account.rs192024 of 14583.4 %–
web/admin.rs5850110 of 42874.3 %–
web/assistant.rs193023 of 13282.6 %–
web/attributes.rs170034 of 13675.0 %–
web/auth_pages.rs285055 of 19772.1 %–
web/bom.rs286051 of 21476.2 %–
web/changes.rs484093 of 40076.8 %–
web/dashboard.rs5503 of 3992.3 %–
web/desktop.rs8501 of 4097.5 %–
web/explorer.rs118010 of 7586.7 %–
web/formats.rs2200 of 16100.0 %–
web/imports.rs242013 of 18793.0 %–
web/interchange.rs241020 of 16888.1 %–
web/items.rs404028 of 28990.3 %–
web/mod.rs889218 of 63997.2 %–
web/notifications.rs17605 of 14896.6 %–
web/personal.rs324039 of 20280.7 %–
web/references.rs143015 of 9684.4 %–
web/requests.rs6720131 of 52775.1 %–
web/revisions.rs11940105 of 101489.6 %–
web/simulations.rs330065 of 25674.6 %–
web/uploads.rs9000 of 49100.0 %–
web/webhooks.rs271048 of 21677.8 %–
webhooks.rs930843 of 58292.6 %read_permissions