python-delphi-lsp 3.1.1__tar.gz → 3.1.2__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 (202) hide show
  1. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/MANIFEST.in +7 -0
  2. {python_delphi_lsp-3.1.1/python_delphi_lsp.egg-info → python_delphi_lsp-3.1.2}/PKG-INFO +8 -2
  3. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/README.md +7 -1
  4. python_delphi_lsp-3.1.2/delphi_lsp/_version.py +1 -0
  5. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/preprocessor.py +6 -0
  6. python_delphi_lsp-3.1.2/docs/performance-delphi.md +161 -0
  7. python_delphi_lsp-3.1.2/docs/performance-fpc.md +239 -0
  8. python_delphi_lsp-3.1.2/docs/release-3.1.2.md +39 -0
  9. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/pyproject.toml +5 -2
  10. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2/python_delphi_lsp.egg-info}/PKG-INFO +8 -2
  11. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/python_delphi_lsp.egg-info/SOURCES.txt +9 -0
  12. python_delphi_lsp-3.1.2/scripts/benchmark_fpc_corpus.py +2056 -0
  13. python_delphi_lsp-3.1.2/scripts/prepare_delphi_corpus.py +213 -0
  14. python_delphi_lsp-3.1.2/scripts/prepare_fpc_corpus.py +171 -0
  15. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/corpora.performance.lock.json +6 -1
  16. python_delphi_lsp-3.1.2/tests/fpc_parse_quality.baseline.json +10266 -0
  17. python_delphi_lsp-3.1.2/tests/test_delphi_performance_corpus.py +210 -0
  18. python_delphi_lsp-3.1.2/tests/test_fpc_performance_corpus.py +521 -0
  19. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_github_performance_corpus.py +1 -1
  20. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_package_metadata.py +13 -3
  21. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_preprocessor.py +139 -0
  22. python_delphi_lsp-3.1.1/delphi_lsp/_version.py +0 -1
  23. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/.github/workflows/ci.yml +0 -0
  24. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/LICENSE +0 -0
  25. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/__init__.py +0 -0
  26. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/agent_cache.py +0 -0
  27. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/agent_cli.py +0 -0
  28. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/agent_context.py +0 -0
  29. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/agent_cpg.py +0 -0
  30. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/agent_cpg_builder.py +0 -0
  31. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/agent_layers.py +0 -0
  32. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/agent_metrics.py +0 -0
  33. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/agent_protocol.py +0 -0
  34. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/agent_relations.py +0 -0
  35. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/agent_templates.py +0 -0
  36. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/agent_wiki.py +0 -0
  37. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/agent_workspace.py +0 -0
  38. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/binary.py +0 -0
  39. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/comment_builder.py +0 -0
  40. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/consts.py +0 -0
  41. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/delphiast_lexer.py +0 -0
  42. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/delphiast_parser.py +0 -0
  43. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/delphiast_tokens.py +0 -0
  44. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/grammar.py +0 -0
  45. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/lark_builder.py +0 -0
  46. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/lark_tokens.py +0 -0
  47. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/lsp_server.py +0 -0
  48. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/metrics.py +0 -0
  49. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/navigation_cache.py +0 -0
  50. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/nodes.py +0 -0
  51. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/parallel_outline.py +0 -0
  52. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/parser.py +0 -0
  53. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/parser_backend.py +0 -0
  54. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/progress.py +0 -0
  55. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/project_config.py +0 -0
  56. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/project_discovery.py +0 -0
  57. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/project_indexer.py +0 -0
  58. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/py.typed +0 -0
  59. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/semantic.py +0 -0
  60. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/semantic_builder.py +0 -0
  61. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/source_reader.py +0 -0
  62. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/workspace.py +0 -0
  63. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/writer.py +0 -0
  64. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/release-2.3.0.md +0 -0
  65. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/release-2.3.3.md +0 -0
  66. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/release-3.0.0.md +0 -0
  67. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/release-3.1.0.md +0 -0
  68. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/release-3.1.1.md +0 -0
  69. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/plans/2026-07-16-architecture-metrics-implementation.md +0 -0
  70. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/plans/2026-07-17-large-codebase-performance.md +0 -0
  71. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/plans/2026-07-22-conditional-outline-ranges.md +0 -0
  72. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/plans/2026-07-23-2.3-performance.md +0 -0
  73. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/plans/2026-07-23-bounded-cli-cache-daemon.md +0 -0
  74. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/plans/2026-07-23-delphiast-python-backend.md +0 -0
  75. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/plans/2026-07-23-parallel-cache-prewarming.md +0 -0
  76. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/plans/2026-07-24-hybrid-cpg.md +0 -0
  77. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/plans/2026-07-24-repository-default-navigation.md +0 -0
  78. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/plans/2026-07-27-okf-memory-progress.md +0 -0
  79. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/plans/2026-07-27-okf-wiki-export.md +0 -0
  80. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/plans/2026-07-27-project-path-configuration.md +0 -0
  81. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/specs/2026-07-16-architecture-metrics-design.md +0 -0
  82. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/specs/2026-07-17-large-codebase-performance-design.md +0 -0
  83. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/specs/2026-07-22-conditional-outline-ranges-design.md +0 -0
  84. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/specs/2026-07-23-2.3-performance-design.md +0 -0
  85. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/specs/2026-07-23-bounded-cli-cache-daemon-design.md +0 -0
  86. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/specs/2026-07-23-delphiast-python-backend-design.md +0 -0
  87. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/specs/2026-07-23-parallel-cache-prewarming-design.md +0 -0
  88. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/specs/2026-07-24-hybrid-cpg-design.md +0 -0
  89. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/specs/2026-07-24-repository-default-navigation-design.md +0 -0
  90. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/specs/2026-07-27-okf-memory-progress-design.md +0 -0
  91. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/specs/2026-07-27-okf-wiki-export-design.md +0 -0
  92. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/specs/2026-07-27-project-path-configuration-design.md +0 -0
  93. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/opencode.json +0 -0
  94. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/python_delphi_lsp.egg-info/dependency_links.txt +0 -0
  95. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/python_delphi_lsp.egg-info/entry_points.txt +0 -0
  96. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/python_delphi_lsp.egg-info/requires.txt +0 -0
  97. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/python_delphi_lsp.egg-info/top_level.txt +0 -0
  98. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/scripts/audit_delphi_language_features.py +0 -0
  99. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/scripts/benchmark_cpg.py +0 -0
  100. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/scripts/benchmark_github_corpus.py +0 -0
  101. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/scripts/benchmark_parallel_cache.py +0 -0
  102. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/scripts/bootstrap_vllm_codebase_skill_test.py +0 -0
  103. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/scripts/bootstrap_vllm_opencode_test.ps1 +0 -0
  104. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/scripts/bootstrap_vllm_opencode_test.py +0 -0
  105. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/scripts/bootstrap_vllm_opencode_test.sh +0 -0
  106. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/scripts/build_github_performance_corpus.py +0 -0
  107. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/scripts/check_ornith_cache.py +0 -0
  108. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/scripts/generate_progress_pdf.py +0 -0
  109. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/scripts/generate_release_evidence.py +0 -0
  110. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/scripts/ollama/ornith-lspctx.Modelfile +0 -0
  111. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/scripts/prepare_ornith_cache.py +0 -0
  112. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/scripts/run_opencode_lsp_probe.py +0 -0
  113. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/scripts/run_openrouter_github_e2e.py +0 -0
  114. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/scripts/start_ornith_vllm.sh +0 -0
  115. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/scripts/summarize_opencode_request_payloads.py +0 -0
  116. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/setup.cfg +0 -0
  117. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/DeprecatedOnConst.pas +0 -0
  118. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/VariantRecordFieldAttributes.pas +0 -0
  119. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/alignedrecords.pas +0 -0
  120. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/constset.pas +0 -0
  121. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/deprecatedtype.pas +0 -0
  122. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/dottedtypes.pas +0 -0
  123. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/endtoken.pas +0 -0
  124. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/experimentals.pas +0 -0
  125. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/externalfunction.pas +0 -0
  126. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/finalizationinitializationexports.pas +0 -0
  127. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/forwardoverloaded.pas +0 -0
  128. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/forwardwithoutsemicolon.pas +0 -0
  129. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/genericconstraints.pas +0 -0
  130. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/genericinterfacemethoddelegation.pas +0 -0
  131. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/implementsgenerictype.pas +0 -0
  132. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/include file2.inc +0 -0
  133. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/includefile.inc +0 -0
  134. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/includefile.pas +0 -0
  135. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/managedrecords.pas +0 -0
  136. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/messagemethod.pas +0 -0
  137. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/multiline.pas +0 -0
  138. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/nonalignedrecords.pas +0 -0
  139. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/numbers.pas +0 -0
  140. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/pointerchars.pas +0 -0
  141. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/properties.pas +0 -0
  142. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/strictvisibility.pas +0 -0
  143. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/tryexcept.pas +0 -0
  144. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/umlauts.pas +0 -0
  145. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/whitespacearoundifdefcondition.pas +0 -0
  146. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/library_demo.dpr +0 -0
  147. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/package_demo.dpk +0 -0
  148. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/program_demo.dpr +0 -0
  149. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/unit_advanced.pas +0 -0
  150. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/unit_attributes.pas +0 -0
  151. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/unit_basic.pas +0 -0
  152. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/unit_consumer.pas +0 -0
  153. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/unit_generics.pas +0 -0
  154. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/unit_inheritance.pas +0 -0
  155. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/unit_math.pas +0 -0
  156. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/unit_properties.pas +0 -0
  157. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/unit_sections.pas +0 -0
  158. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/unit_statements.pas +0 -0
  159. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/unit_types.pas +0 -0
  160. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/unit_unresolved.pas +0 -0
  161. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/unit_with.pas +0 -0
  162. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_agent_cache.py +0 -0
  163. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_agent_cli_errors.py +0 -0
  164. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_agent_codebase.py +0 -0
  165. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_agent_context.py +0 -0
  166. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_agent_cpg.py +0 -0
  167. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_agent_metrics.py +0 -0
  168. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_agent_protocol.py +0 -0
  169. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_agent_relations.py +0 -0
  170. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_agent_wiki.py +0 -0
  171. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_agent_worker.py +0 -0
  172. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_agent_workspace.py +0 -0
  173. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_bootstrap_vllm_codebase_skill.py +0 -0
  174. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_bootstrap_vllm_opencode.py +0 -0
  175. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_delphiast_lexer.py +0 -0
  176. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_delphiast_native_compatibility.py +0 -0
  177. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_delphiast_parser.py +0 -0
  178. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_delphiast_semantic_compatibility.py +0 -0
  179. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_diagnostics.py +0 -0
  180. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_language_feature_matrix.py +0 -0
  181. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_legacy_snippets.py +0 -0
  182. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_lsp_features.py +0 -0
  183. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_lsp_server.py +0 -0
  184. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_lsp_support.py +0 -0
  185. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_metrics.py +0 -0
  186. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_navigation_cache.py +0 -0
  187. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_opencode_config.py +0 -0
  188. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_opencode_probe.py +0 -0
  189. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_opencode_request_payloads.py +0 -0
  190. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_openrouter_github_e2e.py +0 -0
  191. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_ornith_cache_prepare.py +0 -0
  192. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_parallel_outline.py +0 -0
  193. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_parser.py +0 -0
  194. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_parser_backends.py +0 -0
  195. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_progress.py +0 -0
  196. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_project_config.py +0 -0
  197. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_project_discovery.py +0 -0
  198. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_project_indexer.py +0 -0
  199. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_release_evidence.py +0 -0
  200. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_semantic.py +0 -0
  201. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_vllm_start_script.py +0 -0
  202. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_workspace.py +0 -0
@@ -7,6 +7,9 @@ include scripts/check_ornith_cache.py
7
7
  include scripts/audit_delphi_language_features.py
8
8
  include scripts/build_github_performance_corpus.py
9
9
  include scripts/benchmark_github_corpus.py
10
+ include scripts/prepare_fpc_corpus.py
11
+ include scripts/benchmark_fpc_corpus.py
12
+ include scripts/prepare_delphi_corpus.py
10
13
  include scripts/benchmark_cpg.py
11
14
  include scripts/benchmark_parallel_cache.py
12
15
  include scripts/bootstrap_vllm_opencode_test.py
@@ -22,5 +25,9 @@ include scripts/start_ornith_vllm.sh
22
25
  include scripts/summarize_opencode_request_payloads.py
23
26
  include scripts/ollama/ornith-lspctx.Modelfile
24
27
  include tests/corpora.performance.lock.json
28
+ include tests/fpc_parse_quality.baseline.json
29
+ include tests/test_fpc_performance_corpus.py
30
+ include tests/test_delphi_performance_corpus.py
31
+ include docs/performance-delphi.md
25
32
  recursive-include docs *.md
26
33
  recursive-include tests *.py *.pas *.inc *.dpr *.dpk
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-delphi-lsp
3
- Version: 3.1.1
3
+ Version: 3.1.2
4
4
  Summary: Python Delphi/Object Pascal parser, semantic indexer, and language server.
5
5
  Author: Dark Light
6
6
  License-Expression: MPL-2.0
@@ -45,7 +45,7 @@ Dynamic: license-file
45
45
 
46
46
  `python-delphi-lsp` parses Delphi/Object Pascal, builds semantic and project
47
47
  indexes, serves LSP, and provides bounded codebase navigation for agents.
48
- Version 3.1.1 is authored by Dark Light and supports Windows, macOS, and Linux.
48
+ Version 3.1.2 is authored by Dark Light and supports Windows, macOS, and Linux.
49
49
 
50
50
  ## Install and quick start
51
51
 
@@ -521,6 +521,12 @@ source was parsed for CPG. Legacy navigation retained 98.43 percent of its
521
521
  in-run control throughput, above the 95-percent release floor. Reproduce it
522
522
  with `python scripts/benchmark_cpg.py --root CORPUS --query Run --workers 8`.
523
523
 
524
+ Separate reproducible performance profiles cover the coherent FPC compiler
525
+ tree and a project-file-dense Delphi corpus. The Delphi profile can add a
526
+ deterministic `__history`/recovery/build/search-path overlay without changing
527
+ the pinned base corpus. See [the FPC benchmark](docs/performance-fpc.md) and
528
+ [the Delphi discovery benchmark](docs/performance-delphi.md).
529
+
524
530
  For every source size the navigator builds an outline first, loads source detail
525
531
  lazily for a selected target, and returns only selected fragments. Typed source
526
532
  chunks are at most 6000 characters and also respect the response budget. This
@@ -2,7 +2,7 @@
2
2
 
3
3
  `python-delphi-lsp` parses Delphi/Object Pascal, builds semantic and project
4
4
  indexes, serves LSP, and provides bounded codebase navigation for agents.
5
- Version 3.1.1 is authored by Dark Light and supports Windows, macOS, and Linux.
5
+ Version 3.1.2 is authored by Dark Light and supports Windows, macOS, and Linux.
6
6
 
7
7
  ## Install and quick start
8
8
 
@@ -478,6 +478,12 @@ source was parsed for CPG. Legacy navigation retained 98.43 percent of its
478
478
  in-run control throughput, above the 95-percent release floor. Reproduce it
479
479
  with `python scripts/benchmark_cpg.py --root CORPUS --query Run --workers 8`.
480
480
 
481
+ Separate reproducible performance profiles cover the coherent FPC compiler
482
+ tree and a project-file-dense Delphi corpus. The Delphi profile can add a
483
+ deterministic `__history`/recovery/build/search-path overlay without changing
484
+ the pinned base corpus. See [the FPC benchmark](docs/performance-fpc.md) and
485
+ [the Delphi discovery benchmark](docs/performance-delphi.md).
486
+
481
487
  For every source size the navigator builds an outline first, loads source detail
482
488
  lazily for a selected target, and returns only selected fragments. Typed source
483
489
  chunks are at most 6000 characters and also respect the response budget. This
@@ -0,0 +1 @@
1
+ __version__ = "3.1.2"
@@ -472,6 +472,12 @@ class Preprocessor:
472
472
  self._emit_text(output, active_replacement, ctx.file_name, start_line, active=True)
473
473
  return
474
474
 
475
+ if name == 'I' and param.strip() in {'+', '-'}:
476
+ if self._is_active():
477
+ self._apply_named_option(name, param)
478
+ self._emit_text(output, active_replacement, ctx.file_name, start_line, active=True)
479
+ return
480
+
475
481
  if name in {'I', 'INCLUDE'}:
476
482
  if self._is_active():
477
483
  include_name = self._extract_include_name(param)
@@ -0,0 +1,161 @@
1
+ # Delphi-shaped discovery performance profile
2
+
3
+ The `delphi` corpus profile complements the coherent FPC compiler benchmark.
4
+ FPC exercises parsing and outline construction well, but contains few Delphi
5
+ project files. This profile preserves the project density that drives search
6
+ path discovery and can optionally add deterministic IDE/build artifacts.
7
+
8
+ ## Corpus preparation
9
+
10
+ The profile uses the five revisions pinned in
11
+ `tests/corpora.performance.lock.json`: mORMot2, DUnitX, DelphiAST,
12
+ python4delphi, and castle-engine. It deliberately takes the full checkout of
13
+ each pinned repository so project files outside the lock's source subpaths are
14
+ not lost.
15
+
16
+ ```console
17
+ .venv/bin/python scripts/prepare_delphi_corpus.py \
18
+ --workspace /tmp/delphi-corpus \
19
+ --fetch
20
+ ```
21
+
22
+ Cached revisions can subsequently be used with `--offline`. A local clean
23
+ checkout at the exact locked revision can be supplied repeatedly as
24
+ `--checkout NAME=PATH`.
25
+
26
+ The manifest schema records `.pas`, `.inc`, `.dpr`, `.dpk`, `.dproj`, `.lpi`,
27
+ and `.lpr` files. The measured preparation contained 4,055 files and
28
+ 2,983,643 physical lines:
29
+
30
+ | Repository | Files | Lines |
31
+ |---|---:|---:|
32
+ | mORMot2 | 638 | 673,177 |
33
+ | DUnitX | 249 | 65,805 |
34
+ | DelphiAST | 70 | 18,598 |
35
+ | python4delphi | 261 | 98,965 |
36
+ | castle-engine | 2,837 | 2,127,098 |
37
+
38
+ The extension inventory contained 1,930 `.pas`, 1,053 `.inc`, 384 `.dpr`,
39
+ 49 `.dpk`, 373 `.dproj`, 235 `.lpi`, and 31 `.lpr` files. The corpus is
40
+ 16,357 lines short of 3 million. Reports therefore say
41
+ `requested_max_reached: false` and record 2,983,643 as the honest available
42
+ and measured maximum; they never label it as a 3M result.
43
+
44
+ ## Clean and realism runs
45
+
46
+ The default profile is still `fpc`. Select Delphi explicitly:
47
+
48
+ ```console
49
+ .venv/bin/python scripts/benchmark_fpc_corpus.py \
50
+ --profile delphi \
51
+ --workspace /tmp/delphi-corpus \
52
+ --no-worker-sweep \
53
+ --output /tmp/delphi-clean.json
54
+
55
+ .venv/bin/python scripts/benchmark_fpc_corpus.py \
56
+ --profile delphi \
57
+ --realism \
58
+ --workspace /tmp/delphi-corpus \
59
+ --no-worker-sweep \
60
+ --output /tmp/delphi-realism.json
61
+ ```
62
+
63
+ Default Delphi targets are 100k, 250k, 500k, 1M, 2M, and 3M lines. Targets
64
+ above the available corpus are replaced by the exact maximum. Every slice
65
+ reports the requested and actual line count.
66
+
67
+ The opt-in realism overlay is off by default. Its defaults are:
68
+
69
+ - `__history` copies for a stable 30% of `.pas` files, with one to three
70
+ versions selected from a BLAKE2b hash;
71
+ - `__recovery` copies for a stable 10%;
72
+ - source plus plausible `.dcu` output under `bin`, `obj`, `Win32/Debug`, or
73
+ `Win64/Release` for a stable 10%;
74
+ - 64 synthetic `.dpr`/`.dproj` pairs, each with 16 unique search paths.
75
+
76
+ The CLI exposes each parameter as `--realism-*`. Selection never uses Python's
77
+ random state or wall-clock time. All targets are constrained to the temporary
78
+ slice root, copies use hardlinks with a copy fallback, and the report records
79
+ parameters, generated-file count, and a BLAKE2b digest per slice.
80
+
81
+ The overlay simulates discovery pressure, not a complete RAD Studio
82
+ installation. It does not synthesize BDS/RTL source trees, real DCU contents,
83
+ registry state, ACL failures, symlink loops, or arbitrary corrupt files.
84
+
85
+ ## Measured results, 2026-07-28
86
+
87
+ Both reports were measured on Darwin arm64, Python 3.14.3, 10 logical CPUs,
88
+ and 32 GiB RAM. Cold and warm are fresh Python processes; no wall-clock number
89
+ is asserted by CI.
90
+
91
+ | Base lines | Clean cold | Realism cold | Clean sources | Realism sources | Clean paths | Realism paths |
92
+ |---:|---:|---:|---:|---:|---:|---:|
93
+ | 107,263 | 0.752 s | 1.339 s | 383 | 695 | 157 | 1,352 |
94
+ | 251,329 | 1.144 s | 2.159 s | 408 | 738 | 157 | 1,353 |
95
+ | 505,892 | 1.996 s | 3.362 s | 480 | 867 | 162 | 1,374 |
96
+ | 1,009,316 | 3.704 s | 7.328 s | 1,224 | 2,074 | 430 | 1,808 |
97
+ | 2,000,333 | 6.938 s | 12.073 s | 2,959 | 4,299 | 646 | 2,249 |
98
+ | 2,983,643 | 11.113 s | 16.032 s | 3,416 | 5,053 | 692 | 2,366 |
99
+
100
+ At the largest slice the overlay generated 1,893 files. Every one of the
101
+ 1,637 additional source-shaped files was indexed: `sources_visited` equaled
102
+ `sources_indexed`, `sources_skipped` was zero, and the skip-reason histogram
103
+ was empty. That is the intended evidence that the current scanner does not
104
+ exclude `__history`, `__recovery`, `bin`, `obj`, `Win32`, or `Win64`.
105
+ Project entries grew from 433 to 497.
106
+
107
+ | Largest-slice diagnostic | Clean | Realism |
108
+ |---|---:|---:|
109
+ | Discovery | 1.546 s | 3.230 s |
110
+ | Outline/preprocess/model | 8.677 s | 10.689 s |
111
+ | Semantic assembly | 0.135 s | 0.143 s |
112
+ | Total index diagnostic | 10.361 s | 14.066 s |
113
+ | Sources | 3,416 | 5,053 |
114
+ | Search paths | 692 | 2,366 |
115
+
116
+ For context, a fresh diagnostic on the post-F39 3,000,891-line FPC slice
117
+ reported 7,364 sources, zero project entries, 332 search paths, 0.641 seconds
118
+ of discovery, and a 10.975-second cold overview. The largest-slice comparison
119
+ is therefore:
120
+
121
+ | Profile | Base lines | Sources indexed | Projects | Search paths | Discovery | Cold overview |
122
+ |---|---:|---:|---:|---:|---:|---:|
123
+ | FPC | 3,000,891 | 7,364 | 0 | 332 | 0.641 s | 10.975 s |
124
+ | Delphi clean | 2,983,643 | 3,416 | 433 | 692 | 1.546 s | 11.113 s |
125
+ | Delphi realism | 2,983,643 | 5,053 | 497 | 2,366 | 3.230 s | 16.032 s |
126
+
127
+ Clean discovery cost about 0.452 ms per source; realism cost about
128
+ 0.639 ms per source. The cold scaling exponents were 0.819 clean and 0.777
129
+ with realism, both classified as linear by the harness. The earlier
130
+ 30.18-CPU-second pathological discovery result was therefore **not
131
+ reproduced**. The overlay still made the known risk measurable: search paths
132
+ grew 3.4×, sources 1.5×, and absolute discovery time 2.1×.
133
+
134
+ The parser audit intentionally covers the pinned base sources, not generated
135
+ copies. It accepted all 3,416 sources; the role-aware clean ratios were 54.126%
136
+ for units/projects and 95.916% for include fragments.
137
+
138
+ ## CI and next optimizations
139
+
140
+ Fast tests use temporary fixtures only. The real smallest-slice probe is
141
+ opt-in:
142
+
143
+ ```console
144
+ DELPHI_LSP_DELPHI_CORPUS=/tmp/delphi-corpus \
145
+ .venv/bin/python -m pytest -q -m perf \
146
+ tests/test_delphi_performance_corpus.py
147
+ ```
148
+
149
+ The benchmark intentionally leaves these measured product changes for the
150
+ next release:
151
+
152
+ 1. derive overview `unit_count` directly from discovery/model inventory
153
+ (`delphi_lsp/agent_layers.py:327`);
154
+ 2. replace the linear `next(...casefold())` lookup after every resolved path
155
+ with a keyed lookup (`delphi_lsp/project_discovery.py:849-854`);
156
+ 3. decide and implement Delphi-specific exclusions for `__history`,
157
+ `__recovery`, `bin`, `obj`, `Win32`, `Win64`, `Debug`, `Release`, and `.vs`
158
+ (`delphi_lsp/project_discovery.py:22-37`).
159
+
160
+ Those changes are deliberately absent from these measurements so a follow-up
161
+ can compare against the clean and realism reports above.
@@ -0,0 +1,239 @@
1
+ # FPC overview performance benchmark
2
+
3
+ This benchmark answers one product question:
4
+
5
+ > On an Intel Core i5 laptop with 16 GB RAM and Windows 11, can
6
+ > `delphi-lsp-agent view --layer overview` process a repository with
7
+ > 3,000,000 physical Object Pascal lines within 60 seconds?
8
+
9
+ The corpus is the coherent Free Pascal compiler source tree pinned in
10
+ `tests/corpora.performance.lock.json`. Corpus files and reports stay outside
11
+ the repository and are never included in a distribution.
12
+
13
+ ## Prepare the corpus
14
+
15
+ ```console
16
+ .venv/bin/python scripts/prepare_fpc_corpus.py \
17
+ --target-lines 3000000 \
18
+ --workspace /tmp/fpc-3m \
19
+ --fetch
20
+ ```
21
+
22
+ Preparation clones or reuses the exact locked revision, selects anchors
23
+ followed by a deterministic path-sorted prefix of `.pas` and `.inc` files,
24
+ hard-links or copies those files into the external workspace, and verifies
25
+ every line count and SHA-256 before writing `corpus-manifest.json`. An existing
26
+ non-empty workspace is never cleared implicitly.
27
+
28
+ Use `--offline` after the revision is cached. An existing clean checkout at
29
+ the locked revision can be supplied with `--checkout PATH`.
30
+
31
+ ## Run the benchmark
32
+
33
+ ```console
34
+ .venv/bin/python scripts/benchmark_fpc_corpus.py \
35
+ --profile fpc \
36
+ --workspace /tmp/fpc-3m \
37
+ --sizes 250000,500000,1000000,2000000,3000000 \
38
+ --workers 0,1,2,4 \
39
+ --output /tmp/fpc-report.json
40
+ ```
41
+
42
+ `fpc` is the default profile, so existing invocations may omit
43
+ `--profile fpc`. The project-file-dense companion profile is documented in
44
+ `docs/performance-delphi.md`.
45
+
46
+ The default run performs:
47
+
48
+ - cold and warm overview calls in separate Python processes;
49
+ - five deterministic scaling slices and a log-log scaling fit;
50
+ - a 1M-line worker sweep;
51
+ - import-floor and phase diagnostics;
52
+ - a full recovery-oriented DelphiAST compatibility audit.
53
+
54
+ `--skip-warm`, `--no-parse-audit`, `--no-worker-sweep`, and
55
+ `--no-phase-breakdown` shorten exploratory runs. `--report-only` writes all
56
+ failures but exits successfully. The release budgets are configurable with
57
+ `--budget-cold`, `--budget-warm`, `--budget-rss-gib`,
58
+ `--min-parse-ratio`, `--max-scaling-exponent`,
59
+ `--max-clean-ratio-regression`, `--max-problem-count-regression`, and
60
+ `--new-problem-threshold`.
61
+
62
+ The parser-quality gate compares the run with
63
+ `tests/fpc_parse_quality.baseline.json`. Regenerate that file deliberately
64
+ only after a passing run:
65
+
66
+ ```console
67
+ .venv/bin/python scripts/benchmark_fpc_corpus.py \
68
+ --workspace /tmp/fpc-3m \
69
+ --output /tmp/fpc-report.json \
70
+ --update-baseline
71
+ ```
72
+
73
+ `--update-baseline` refuses to write when any non-quality release gate fails
74
+ or when the parser audit is disabled. This prevents accepting a slow, crashing,
75
+ or pathologically scaling run merely by replacing its baseline.
76
+
77
+ The opt-in pytest integration probe uses the smallest slice:
78
+
79
+ ```console
80
+ DELPHI_LSP_FPC_CORPUS=/tmp/fpc-3m \
81
+ .venv/bin/python -m pytest -q -m perf \
82
+ tests/test_fpc_performance_corpus.py
83
+ ```
84
+
85
+ Normal pytest runs exclude the `perf` marker and require neither network nor
86
+ an external corpus.
87
+
88
+ ## Budgets and interpretation
89
+
90
+ | Gate | Default | Meaning |
91
+ |---|---:|---|
92
+ | 3M cold overview | 60.0 s | Primary product question |
93
+ | 3M warm overview | 5.0 s | Second invocation in a fresh process |
94
+ | Peak RSS | 11 GiB | Leaves room on a 16 GB Windows/editor machine |
95
+ | Parse acceptance ratio | 0.95 | Parser returned, cleanly or through recovery |
96
+ | Clean ratio regression | 0.01 absolute | Per-role drop from the committed baseline |
97
+ | Known problem growth | 5% relative | Per-description increase from baseline |
98
+ | New problem threshold | 50 | Previously unseen description count |
99
+ | Scaling exponent | 1.15 | Rejects growth that extrapolates poorly |
100
+
101
+ Cold means the exact slice-local `.delphi-lsp` directory is removed and its
102
+ absence verified. Warm means a second fresh process without another removal.
103
+ The current `view` path does not write a persistent navigation cache, so its
104
+ warm result benefits only from the operating system's filesystem cache.
105
+
106
+ The overview command performs project/source discovery, source reads,
107
+ conditional outline processing, outline semantic-model construction, unit
108
+ scope registration, and overview payload construction. It does not full-parse
109
+ units or traverse complete reference relations. The full parser audit is
110
+ therefore measured and reported separately. It selects recovery-oriented
111
+ DelphiAST tolerant mode so every recoverable FPC problem remains countable;
112
+ the report states that mode and that the small-file Lark fallback is disabled
113
+ for this audit.
114
+
115
+ The report distinguishes three ratios:
116
+
117
+ - `accepted_ratio` is unchanged: it counts files for which parsing did not
118
+ raise. It remains the 0.95 crash floor.
119
+ - `clean_parse_ratio_units` counts complete units, programs, libraries, and
120
+ packages with zero reported problems.
121
+ - `clean_parse_ratio_includes` counts fragments with zero applicable problems.
122
+ It excludes only
123
+ `Expected unit, program, library, or package header`, because a fragment is
124
+ not a standalone compilation unit. The report records this exact rule and
125
+ rationale in `clean_ratio_exclusions`; no other problem is silently dropped.
126
+
127
+ `parse_success_ratio` remains a deprecated alias of `accepted_ratio` for one
128
+ report-schema release. `metric_definitions` identifies the alias explicitly.
129
+
130
+ Role detection is source-shaped rather than extension-only. After leading
131
+ whitespace, comments, and compiler directives are skipped, a first token of
132
+ `unit`, `program`, `library`, or `package` makes the file a unit. This catches
133
+ complete `.inc` files. Headerless `.pas` files are fragments, while `.dpr` and
134
+ `.dpk` retain unit status if preprocessing hides their header. In the measured
135
+ FPC slice this classified 3,682 files in each role, including 27 complete
136
+ `.inc` units and 53 `.pas` fragments.
137
+
138
+ ## Measured result, 2026-07-28
139
+
140
+ The report was produced at
141
+ `/tmp/python-delphi-lsp-fpc-report.json` from FPC revision
142
+ `a8e7ad4e2f2f6d3bdc240850075d85e659a42ff8` on Darwin arm64, Python
143
+ 3.14.3, 10 logical CPUs, and 32 GiB RAM. These are not target-hardware
144
+ measurements.
145
+
146
+ | Requested slice | Files | Physical lines | Cold | Warm | Peak RSS | Accepted |
147
+ |---:|---:|---:|---:|---:|---:|---:|
148
+ | 250k | 268 | 290,162 | 1.074 s | 1.121 s | 64.2 MiB | 100% |
149
+ | 500k | 584 | 500,068 | 1.816 s | 1.787 s | 95.7 MiB | 100% |
150
+ | 1M | 2,505 | 1,000,095 | 4.610 s | 4.140 s | 187.6 MiB | 100% |
151
+ | 2M | 6,007 | 2,000,205 | 9.015 s | 8.818 s | 422.7 MiB | 100% |
152
+ | 3M | 7,364 | 3,000,891 | 13.608 s | 12.819 s | 538.3 MiB | 100% |
153
+
154
+ The cold scaling exponent was **1.1054**, classified as **n_log_n**
155
+ (`R² = 0.9966`). This passes the 1.15 scaling gate. The run's overall status
156
+ was **fail** because the 3M fresh-process warm result exceeded its budget. The
157
+ measured cold 60-second target, RSS, parse-ratio, and scaling gates passed.
158
+ Cold throughput declined from 270,231 lines/s on the smallest slice to
159
+ 220,529 lines/s at 3M; exact cold and warm throughput is present on every
160
+ slice in the JSON report.
161
+
162
+ After the IOChecks-directive correction, a fresh 3M parser audit processed
163
+ 3,000,891 physical and 4,957,004 post-preprocessing lines. All 7,364 files
164
+ returned a recoverable result. The raw problem-free count rose from 1,171 to
165
+ 1,208, and files carrying problems fell from 6,193 to 6,156. Unresolved
166
+ include problems fell from 2,533 to 2,261; all 228
167
+ `include not found: -` and 44 `include not found: +` reports disappeared.
168
+ Syntax recoveries remained 20,686.
169
+
170
+ The post-fix role-aware clean ratios committed in the baseline are:
171
+
172
+ | Role | Clean | Total | Clean ratio |
173
+ |---|---:|---:|---:|
174
+ | Units/projects | 1,192 | 3,682 | 32.374% |
175
+ | Include fragments | 3,364 | 3,682 | 91.363% |
176
+
177
+ The include ratio applies the one documented structural exclusion above. The
178
+ committed baseline also contains every problem-description count, not only a
179
+ top-ten summary, so a frequent new recovery mode is gated even when the crash
180
+ ratio stays at 100%.
181
+
182
+ ## Largest-slice phase profile
183
+
184
+ | Phase | Seconds |
185
+ |---|---:|
186
+ | Discovery | 1.497 |
187
+ | Read-only source probe | 0.619 |
188
+ | Conditional outline, parse, and model construction | 15.785 |
189
+ | Semantic index assembly | 0.199 |
190
+ | Full relation traversal | not used |
191
+ | Overview payload | 0.000009 |
192
+ | Total index diagnostic | 17.491 |
193
+
194
+ Outline workers combine reads, conditional preprocessing, outline parsing,
195
+ and model construction, so the read number is a separate diagnostic pass and
196
+ is not subtracted from the measured outline time.
197
+
198
+ ## Worker sweep at 1M lines
199
+
200
+ | Workers | Cold | Speedup vs. one worker | Peak RSS |
201
+ |---:|---:|---:|---:|
202
+ | default/0 | 6.707 s | 2.261× | 186.7 MiB |
203
+ | 1 | 15.165 s | 1.000× | 221.1 MiB |
204
+ | 2 | 9.206 s | 1.647× | 185.3 MiB |
205
+ | 4 | 9.350 s | 1.622× | 188.2 MiB |
206
+
207
+ The automatic/default worker count was fastest on the measured machine.
208
+ Windows uses spawned workers too, but the optimum must be measured on the
209
+ target laptop.
210
+
211
+ ## Verdict and findings
212
+
213
+ On the measured machine the answer is **yes**: the 3M cold overview completed
214
+ in 13.608 seconds. Applying the explicitly assumed, unverified 4× slowdown
215
+ projects 54.431 seconds on the Windows i5 target, within the 60-second budget.
216
+ That projection is not a Windows measurement, so the target-hardware question
217
+ remains projected rather than proven.
218
+
219
+ Important findings:
220
+
221
+ - `view` creates no persistent `.delphi-lsp` cache
222
+ (`delphi_lsp/agent_cli.py:313-321`), so the second fresh-process invocation
223
+ still rebuilds the whole outline and misses the 5-second warm budget.
224
+ - Outline/preprocessing/model work dominates the largest slice
225
+ (`delphi_lsp/agent_layers.py:76-127`); overview payload construction is
226
+ negligible.
227
+ - Discovery indexed all 7,364 manifest source files and skipped none. `.pp`
228
+ files are excluded because the product task filter accepts `.pas`, `.inc`,
229
+ `.dpr`, and `.dpk` (`delphi_lsp/agent_layers.py:76-81`).
230
+ - Recovery parsing exposes broad FPC-dialect incompatibility despite a 100%
231
+ recoverable-result ratio: 84.1% of files report at least one problem
232
+ (`delphi_lsp/parser.py:88-127`).
233
+ - The strict small-file Lark branch
234
+ (`delphi_lsp/parser.py:99-108`) is not the overview path and proved
235
+ unsuitable for a bounded full-corpus compatibility audit; the report uses
236
+ and labels DelphiAST tolerant mode instead.
237
+ - The parent-process RSS measurement reuses the existing Windows PSAPI
238
+ implementation but cannot aggregate spawned-worker RSS
239
+ (`delphi_lsp/parallel_outline.py:123-181`).
@@ -0,0 +1,39 @@
1
+ # Python Delphi LSP 3.1.2
2
+
3
+ Version 3.1.2 is a parser-correctness and benchmark-quality release.
4
+
5
+ ## Preprocessor correctness
6
+
7
+ - Delphi compiler switches such as `{$I-}` and `{$I+}` are no longer
8
+ interpreted as include directives.
9
+ - The adversarial FPC corpus check reduced phantom include problems from 272
10
+ to zero.
11
+
12
+ ## Honest parse-quality metrics
13
+
14
+ - The existing accepted-unit ratio remains available for continuity.
15
+ - `clean_parse_ratio_units` and `clean_parse_ratio_includes` now expose how
16
+ much source parsed without recovered errors.
17
+ - Benchmark gates can compare those clean ratios with a pinned baseline and
18
+ fail on regressions.
19
+
20
+ ## Reproducible performance profiles
21
+
22
+ - A Delphi corpus profile pins five public repositories and records project
23
+ files deterministically.
24
+ - A deterministic realism overlay exercises malformed and deeply nested
25
+ Delphi input without changing the checked-out upstream sources.
26
+ - This release improves the benchmark harness and reporting; it does not claim
27
+ a product-speedup from those measurement changes.
28
+
29
+ ## Verification
30
+
31
+ - Full unit and integration suite
32
+ - Opt-in FPC and Delphi corpus performance tests
33
+ - Wheel and source-distribution metadata checks
34
+
35
+ Install or upgrade with:
36
+
37
+ ```bash
38
+ python -m pip install --upgrade python-delphi-lsp==3.1.2
39
+ ```
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "python-delphi-lsp"
7
- version = "3.1.1"
7
+ version = "3.1.2"
8
8
  description = "Python Delphi/Object Pascal parser, semantic indexer, and language server."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -68,4 +68,7 @@ delphi_lsp = ["py.typed"]
68
68
  [tool.pytest.ini_options]
69
69
  testpaths = ["tests"]
70
70
  pythonpath = ["."]
71
- addopts = "--timeout=120 --timeout-method=thread"
71
+ addopts = "--timeout=120 --timeout-method=thread -m 'not perf'"
72
+ markers = [
73
+ "perf: opt-in benchmarks that require an externally prepared real-world corpus",
74
+ ]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-delphi-lsp
3
- Version: 3.1.1
3
+ Version: 3.1.2
4
4
  Summary: Python Delphi/Object Pascal parser, semantic indexer, and language server.
5
5
  Author: Dark Light
6
6
  License-Expression: MPL-2.0
@@ -45,7 +45,7 @@ Dynamic: license-file
45
45
 
46
46
  `python-delphi-lsp` parses Delphi/Object Pascal, builds semantic and project
47
47
  indexes, serves LSP, and provides bounded codebase navigation for agents.
48
- Version 3.1.1 is authored by Dark Light and supports Windows, macOS, and Linux.
48
+ Version 3.1.2 is authored by Dark Light and supports Windows, macOS, and Linux.
49
49
 
50
50
  ## Install and quick start
51
51
 
@@ -521,6 +521,12 @@ source was parsed for CPG. Legacy navigation retained 98.43 percent of its
521
521
  in-run control throughput, above the 95-percent release floor. Reproduce it
522
522
  with `python scripts/benchmark_cpg.py --root CORPUS --query Run --workers 8`.
523
523
 
524
+ Separate reproducible performance profiles cover the coherent FPC compiler
525
+ tree and a project-file-dense Delphi corpus. The Delphi profile can add a
526
+ deterministic `__history`/recovery/build/search-path overlay without changing
527
+ the pinned base corpus. See [the FPC benchmark](docs/performance-fpc.md) and
528
+ [the Delphi discovery benchmark](docs/performance-delphi.md).
529
+
524
530
  For every source size the navigator builds an outline first, loads source detail
525
531
  lazily for a selected target, and returns only selected fragments. Typed source
526
532
  chunks are at most 6000 characters and also respect the response budget. This
@@ -45,11 +45,14 @@ delphi_lsp/semantic_builder.py
45
45
  delphi_lsp/source_reader.py
46
46
  delphi_lsp/workspace.py
47
47
  delphi_lsp/writer.py
48
+ docs/performance-delphi.md
49
+ docs/performance-fpc.md
48
50
  docs/release-2.3.0.md
49
51
  docs/release-2.3.3.md
50
52
  docs/release-3.0.0.md
51
53
  docs/release-3.1.0.md
52
54
  docs/release-3.1.1.md
55
+ docs/release-3.1.2.md
53
56
  docs/superpowers/plans/2026-07-16-architecture-metrics-implementation.md
54
57
  docs/superpowers/plans/2026-07-17-large-codebase-performance.md
55
58
  docs/superpowers/plans/2026-07-22-conditional-outline-ranges.md
@@ -82,6 +85,7 @@ python_delphi_lsp.egg-info/requires.txt
82
85
  python_delphi_lsp.egg-info/top_level.txt
83
86
  scripts/audit_delphi_language_features.py
84
87
  scripts/benchmark_cpg.py
88
+ scripts/benchmark_fpc_corpus.py
85
89
  scripts/benchmark_github_corpus.py
86
90
  scripts/benchmark_parallel_cache.py
87
91
  scripts/bootstrap_vllm_codebase_skill_test.py
@@ -92,6 +96,8 @@ scripts/build_github_performance_corpus.py
92
96
  scripts/check_ornith_cache.py
93
97
  scripts/generate_progress_pdf.py
94
98
  scripts/generate_release_evidence.py
99
+ scripts/prepare_delphi_corpus.py
100
+ scripts/prepare_fpc_corpus.py
95
101
  scripts/prepare_ornith_cache.py
96
102
  scripts/run_opencode_lsp_probe.py
97
103
  scripts/run_openrouter_github_e2e.py
@@ -99,6 +105,7 @@ scripts/start_ornith_vllm.sh
99
105
  scripts/summarize_opencode_request_payloads.py
100
106
  scripts/ollama/ornith-lspctx.Modelfile
101
107
  tests/corpora.performance.lock.json
108
+ tests/fpc_parse_quality.baseline.json
102
109
  tests/test_agent_cache.py
103
110
  tests/test_agent_cli_errors.py
104
111
  tests/test_agent_codebase.py
@@ -112,11 +119,13 @@ tests/test_agent_worker.py
112
119
  tests/test_agent_workspace.py
113
120
  tests/test_bootstrap_vllm_codebase_skill.py
114
121
  tests/test_bootstrap_vllm_opencode.py
122
+ tests/test_delphi_performance_corpus.py
115
123
  tests/test_delphiast_lexer.py
116
124
  tests/test_delphiast_native_compatibility.py
117
125
  tests/test_delphiast_parser.py
118
126
  tests/test_delphiast_semantic_compatibility.py
119
127
  tests/test_diagnostics.py
128
+ tests/test_fpc_performance_corpus.py
120
129
  tests/test_github_performance_corpus.py
121
130
  tests/test_language_feature_matrix.py
122
131
  tests/test_legacy_snippets.py