D-SafeLogger 0.2.2__tar.gz → 0.3.0__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 (175) hide show
  1. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/BENCHMARK.md +20 -8
  2. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/CHANGELOG.md +11 -0
  3. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/MANIFEST.in +2 -2
  4. {d_safelogger-0.2.2/src/D_SafeLogger.egg-info → d_safelogger-0.3.0}/PKG-INFO +52 -59
  5. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/README.md +51 -58
  6. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/README_ja.md +64 -71
  7. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/TESTING.md +9 -8
  8. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/benchmarks/_benchmark_report.py +48 -3
  9. {d_safelogger-0.2.2/benchmarks/results/benchmarks_multi_resilience_20260506_211129 → d_safelogger-0.3.0/benchmarks/results/benchmarks_multi_resilience_20260523_084326}/summary.json +1962 -393
  10. {d_safelogger-0.2.2/benchmarks/results/benchmarks_multi_resilience_20260506_211129 → d_safelogger-0.3.0/benchmarks/results/benchmarks_multi_resilience_20260523_084326}/summary.md +27 -15
  11. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/benchmarks/summary/index.md +1 -1
  12. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/benchmarks/summary/manifest.json +1 -1
  13. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/benchmarks/summary/multiprocess_resilience.md +30 -18
  14. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/docs/api/dsafelogger__mp.md +34 -1
  15. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/docs/api/dsafelogger__mp_attach.md +4 -0
  16. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/docs/api/dsafelogger__mp_control.md +4 -2
  17. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/docs/api/dsafelogger__mp_protocol.md +1 -1
  18. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/docs/api/dsafelogger__mp_runtime.md +6 -0
  19. d_safelogger-0.3.0/docs/api/dsafelogger__runtime_warning.md +32 -0
  20. d_safelogger-0.3.0/docs/api/dsafelogger__shutdown_report.md +15 -0
  21. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/docs/api/index.md +2 -0
  22. d_safelogger-0.2.2/docs/design/D-SafeLogger_DetailedDesign_v23j.md → d_safelogger-0.3.0/docs/design/D-SafeLogger_DetailedDesign_v23k.md +3 -1
  23. d_safelogger-0.2.2/docs/design/D-SafeLogger_TestDesign_v23j.md → d_safelogger-0.3.0/docs/design/D-SafeLogger_TestDesign_v23k.md +16 -5
  24. d_safelogger-0.2.2/docs/design/D-SafeLogger_v23j_WhitePaper.md → d_safelogger-0.3.0/docs/design/D-SafeLogger_v23k_WhitePaper.md +126 -118
  25. d_safelogger-0.2.2/docs/design/D-SafeLogger_v23j_WhitePaper_en.md → d_safelogger-0.3.0/docs/design/D-SafeLogger_v23k_WhitePaper_en.md +126 -118
  26. d_safelogger-0.2.2/docs/design/D_SafeLogger_Specification_v23j_full.md → d_safelogger-0.3.0/docs/design/D_SafeLogger_Specification_v23k_full.md +13 -1
  27. d_safelogger-0.2.2/docs/design/D_SafeLogger_Specification_v23j_full_en.md → d_safelogger-0.3.0/docs/design/D_SafeLogger_Specification_v23k_full_en.md +13 -1
  28. d_safelogger-0.3.0/docs/design/v23k_supplements/delivery_status_schema.md +776 -0
  29. d_safelogger-0.3.0/docs/design/v23k_supplements/mp_observability_test_matrix.md +30 -0
  30. d_safelogger-0.3.0/docs/design/v23k_supplements/runtime_warning_design.md +35 -0
  31. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/examples/12_multiprocess_logging.md +56 -18
  32. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/pyproject.toml +1 -1
  33. {d_safelogger-0.2.2 → d_safelogger-0.3.0/src/D_SafeLogger.egg-info}/PKG-INFO +52 -59
  34. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/src/D_SafeLogger.egg-info/SOURCES.txt +18 -8
  35. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/src/dsafelogger/__init__.py +1 -1
  36. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/src/dsafelogger/_mp_attach.py +99 -0
  37. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/src/dsafelogger/_mp_control.py +19 -2
  38. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/src/dsafelogger/_mp_protocol.py +2 -1
  39. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/src/dsafelogger/_mp_runtime.py +402 -21
  40. d_safelogger-0.3.0/src/dsafelogger/_runtime_warning.py +139 -0
  41. d_safelogger-0.3.0/src/dsafelogger/_shutdown_report.py +46 -0
  42. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/src/dsafelogger/mp/__init__.py +145 -1
  43. d_safelogger-0.3.0/tests/test_delivery_status_api.py +196 -0
  44. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/test_mp_attach.py +92 -0
  45. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/test_mp_control.py +31 -2
  46. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/test_mp_runtime.py +256 -2
  47. d_safelogger-0.3.0/tests/test_runtime_warning.py +363 -0
  48. d_safelogger-0.3.0/tests/test_shutdown_report.py +313 -0
  49. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/typing_smoke/public_api_smoke.py +30 -0
  50. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/uv.lock +1 -1
  51. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/CONTRIBUTING.md +0 -0
  52. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/LICENSE +0 -0
  53. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/SECURITY.md +0 -0
  54. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/benchmarks/results/benchmark_20260506_180018/summary.json +0 -0
  55. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/benchmarks/results/benchmark_20260506_180018/summary.md +0 -0
  56. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/benchmarks/results/benchmarks_multi_integ_20260506_185947/summary.json +0 -0
  57. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/benchmarks/results/benchmarks_multi_integ_20260506_185947/summary.md +0 -0
  58. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/benchmarks/results/benchmarks_multi_perf_20260506_190518/summary.json +0 -0
  59. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/benchmarks/results/benchmarks_multi_perf_20260506_190518/summary.md +0 -0
  60. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/benchmarks/summary/multiprocess_integrity.md +0 -0
  61. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/benchmarks/summary/multiprocess_performance.md +0 -0
  62. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/benchmarks/summary/single_process.md +0 -0
  63. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/benchmarks/update_summary.py +0 -0
  64. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/docs/api/dsafelogger.md +0 -0
  65. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/docs/api/dsafelogger__async.md +0 -0
  66. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/docs/api/dsafelogger__cli.md +0 -0
  67. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/docs/api/dsafelogger__color.md +0 -0
  68. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/docs/api/dsafelogger__config_validation.md +0 -0
  69. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/docs/api/dsafelogger__constants.md +0 -0
  70. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/docs/api/dsafelogger__context.md +0 -0
  71. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/docs/api/dsafelogger__env_parser.md +0 -0
  72. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/docs/api/dsafelogger__formatter.md +0 -0
  73. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/docs/api/dsafelogger__handler.md +0 -0
  74. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/docs/api/dsafelogger__ini_loader.md +0 -0
  75. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/docs/api/dsafelogger__integrity.md +0 -0
  76. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/docs/api/dsafelogger__levels.md +0 -0
  77. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/docs/api/dsafelogger__logger.md +0 -0
  78. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/docs/api/dsafelogger__mp_queue.md +0 -0
  79. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/docs/api/dsafelogger__pipeline.md +0 -0
  80. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/docs/api/dsafelogger__purge.md +0 -0
  81. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/docs/api/dsafelogger__routing.md +0 -0
  82. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/docs/api/dsafelogger__sink.md +0 -0
  83. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/docs/api/dsafelogger__transport.md +0 -0
  84. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/docs/api/dsafelogger__validator.md +0 -0
  85. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/docs/api/dsafelogger__writer_formatter.md +0 -0
  86. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/examples/01_quick_start.md +0 -0
  87. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/examples/02_configuration_guide.md +0 -0
  88. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/examples/03_migration_from_stdlib.md +0 -0
  89. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/examples/04_stdlib_ecosystem_coexistence.md +0 -0
  90. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/examples/05_windows_service_and_scheduled_batch.md +0 -0
  91. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/examples/06_web_api_logging.md +0 -0
  92. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/examples/07_long_running_service.md +0 -0
  93. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/examples/08_compliance_audit.md +0 -0
  94. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/examples/09_debugging_production.md +0 -0
  95. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/examples/10_incident_response_bundle.md +0 -0
  96. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/examples/11_async_performance.md +0 -0
  97. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/examples/13_external_rotation_reopen.md +0 -0
  98. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/examples/14_cli_operations.md +0 -0
  99. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/examples/15_opentelemetry_logging.md +0 -0
  100. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/examples/16_structlog_coexistence.md +0 -0
  101. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/examples/17_container_collector_coexistence.md +0 -0
  102. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/setup.cfg +0 -0
  103. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/src/D_SafeLogger.egg-info/dependency_links.txt +0 -0
  104. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/src/D_SafeLogger.egg-info/entry_points.txt +0 -0
  105. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/src/D_SafeLogger.egg-info/top_level.txt +0 -0
  106. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/src/dsafelogger/_async.py +0 -0
  107. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/src/dsafelogger/_cli.py +0 -0
  108. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/src/dsafelogger/_color.py +0 -0
  109. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/src/dsafelogger/_config_validation.py +0 -0
  110. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/src/dsafelogger/_constants.py +0 -0
  111. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/src/dsafelogger/_context.py +0 -0
  112. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/src/dsafelogger/_env_parser.py +0 -0
  113. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/src/dsafelogger/_formatter.py +0 -0
  114. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/src/dsafelogger/_handler.py +0 -0
  115. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/src/dsafelogger/_ini_loader.py +0 -0
  116. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/src/dsafelogger/_integrity.py +0 -0
  117. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/src/dsafelogger/_levels.py +0 -0
  118. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/src/dsafelogger/_logger.py +0 -0
  119. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/src/dsafelogger/_mp_queue.py +0 -0
  120. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/src/dsafelogger/_pipeline.py +0 -0
  121. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/src/dsafelogger/_purge.py +0 -0
  122. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/src/dsafelogger/_routing.py +0 -0
  123. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/src/dsafelogger/_sink.py +0 -0
  124. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/src/dsafelogger/_transport.py +0 -0
  125. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/src/dsafelogger/_validator.py +0 -0
  126. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/src/dsafelogger/_writer_formatter.py +0 -0
  127. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/src/dsafelogger/py.typed +0 -0
  128. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/conftest.py +0 -0
  129. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/examples/test_03_migration_from_stdlib.py +0 -0
  130. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/examples/test_04_stdlib_ecosystem_coexistence.py +0 -0
  131. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/examples/test_05_windows_service_and_scheduled_batch.py +0 -0
  132. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/examples/test_06_web_api_logging.py +0 -0
  133. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/examples/test_07_long_running_service.py +0 -0
  134. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/examples/test_08_compliance_audit.py +0 -0
  135. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/examples/test_09_debugging_production.py +0 -0
  136. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/examples/test_10_incident_response_bundle.py +0 -0
  137. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/examples/test_11_async_performance.py +0 -0
  138. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/examples/test_12_multiprocess_logging.py +0 -0
  139. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/examples/test_13_external_rotation_reopen.py +0 -0
  140. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/examples/test_14_cli_operations.py +0 -0
  141. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/examples/test_15_opentelemetry_logging.py +0 -0
  142. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/examples/test_16_structlog_coexistence.py +0 -0
  143. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/examples/test_17_container_collector_coexistence.py +0 -0
  144. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/test_async.py +0 -0
  145. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/test_cli.py +0 -0
  146. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/test_color.py +0 -0
  147. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/test_configure.py +0 -0
  148. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/test_context.py +0 -0
  149. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/test_coverage_boost.py +0 -0
  150. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/test_diagnose.py +0 -0
  151. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/test_env_parser.py +0 -0
  152. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/test_formatter.py +0 -0
  153. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/test_getlogger.py +0 -0
  154. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/test_handler.py +0 -0
  155. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/test_ini_loader.py +0 -0
  156. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/test_integration.py +0 -0
  157. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/test_integrity.py +0 -0
  158. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/test_levels.py +0 -0
  159. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/test_logger.py +0 -0
  160. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/test_merge.py +0 -0
  161. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/test_mp_configure.py +0 -0
  162. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/test_mp_fork.py +0 -0
  163. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/test_mp_formatter.py +0 -0
  164. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/test_mp_integration.py +0 -0
  165. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/test_mp_spawn_windows.py +0 -0
  166. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/test_opentelemetry.py +0 -0
  167. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/test_pipeline.py +0 -0
  168. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/test_purge.py +0 -0
  169. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/test_reopen.py +0 -0
  170. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/test_routing.py +0 -0
  171. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/test_structlog.py +0 -0
  172. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/test_transport.py +0 -0
  173. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/test_validator.py +0 -0
  174. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/test_version.py +0 -0
  175. {d_safelogger-0.2.2 → d_safelogger-0.3.0}/tests/typing_smoke/__init__.py +0 -0
@@ -14,7 +14,7 @@ D-SafeLogger is competitive in single-process logging, especially in async mode
14
14
 
15
15
  Multiprocess results should be interpreted differently. D-SafeLogger is not the fastest multiprocess backend in this benchmark; stdlib logging leads throughput in all measured multiprocess performance cells. D-SafeLogger's multiprocess value is not raw speed. Its value is Writer-owned sinks, explicit attach/detach, bounded shutdown, and classified delivery-state observability under operational stress.
16
16
 
17
- The resilience profile is the strongest multiprocess evidence. Across 12 D-SafeLogger resilience summary rows, D-SafeLogger produced classified loss/reject/drop fields for 12/12 rows and fully explained 12/12 rows. That is the benchmark-backed claim: D-SafeLogger can explain what happened to records under backpressure, sink rejection, and mixed worker shutdown, instead of leaving delivery state ambiguous.
17
+ The resilience profile is the strongest multiprocess evidence. Across 16 D-SafeLogger resilience summary rows, D-SafeLogger produced classified loss/reject/drop fields for 16/16 rows and fully explained 16/16 rows. That is the benchmark-backed claim: D-SafeLogger can explain what happened to records under backpressure, sink rejection, mixed worker shutdown, and warning-IPC fallback, instead of leaving delivery state ambiguous.
18
18
 
19
19
  ## Published Summaries
20
20
 
@@ -30,7 +30,7 @@ The resilience profile is the strongest multiprocess evidence. Across 12 D-SafeL
30
30
  | Single-process | `benchmark_20260506_180018` | Throughput and latency comparison across D-SafeLogger, stdlib logging, loguru, and structlog |
31
31
  | Multiprocess integrity | `benchmarks_multi_integ_20260506_185947` | Normal-condition delivery completeness and JSON/route integrity |
32
32
  | Multiprocess performance | `benchmarks_multi_perf_20260506_190518` | Raw multiprocess throughput and latency comparison |
33
- | Multiprocess resilience | `benchmarks_multi_resilience_20260506_211129` | Operational failure-mode observability and classified delivery state |
33
+ | Multiprocess resilience | `benchmarks_multi_resilience_20260523_084326` | Operational failure-mode observability and classified delivery state |
34
34
 
35
35
  The selected sessions are controlled by [`benchmarks/summary/manifest.json`](benchmarks/summary/manifest.json). Running a new benchmark does not automatically change the public analysis.
36
36
 
@@ -112,27 +112,38 @@ The resilience profile measures what can be explained during operational stress.
112
112
 
113
113
  Selected result summary:
114
114
 
115
- - D-SafeLogger produced classified loss/reject/drop fields for 12/12 summary rows.
116
- - D-SafeLogger fully explained 12/12 summary rows.
115
+ - D-SafeLogger produced classified loss/reject/drop fields for 16/16 summary rows.
116
+ - D-SafeLogger fully explained 16/16 summary rows.
117
117
  - stdlib logging and loguru rows are marked `observability_gap` where accepted/dropped/unexplained state cannot be classified by the benchmarked backend contract.
118
118
 
119
119
  Representative D-SafeLogger rows:
120
120
 
121
121
  | Scenario | Python/GIL | Attempted | Accepted | Delivered | KnownRejected | KnownDropped | UnexplainedLost | Shutdown |
122
122
  |---|---|---:|---:|---:|---:|---:|---:|---|
123
- | burst_backpressure | 3.13/enabled | 100 | 100 | 99 | 0 | 1 | 0 | clean |
124
- | burst_backpressure | 3.14/enabled | 100 | 100 | 100 | 0 | 0 | 0 | clean |
125
- | burst_backpressure | 3.14/disabled | 100 | 100 | 100 | 0 | 0 | 0 | clean |
126
- | rolling_restart_mixed_shutdown | all measured | 62 | 62 | 62 | 0 | 0 | 0 | clean_with_worker_crash |
123
+ | burst_backpressure | all measured | 100 | 100 | 100 | 0 | 0 | 0 | clean |
124
+ | ipc_forced_disconnect | all measured | 100 | 100 | 100 | 0 | 0 | 0 | clean |
125
+ | rolling_restart_mixed_shutdown | all measured | 50 | 62 | 62 | 0 | 0 | 0 | clean_with_worker_crash |
127
126
  | sink_temporarily_unavailable | all measured | 100 | 100 | 0 | 100 | 0 | 0 | clean |
128
127
 
129
128
  Interpretation:
130
129
 
131
130
  - In backpressure scenarios, D-SafeLogger may drop records, but the drops are classified as known drops rather than unexplained loss.
131
+ - In warning-IPC fallback scenarios, D-SafeLogger records per-worker fallback warning files while preserving delivery accounting.
132
132
  - In mixed shutdown scenarios, D-SafeLogger can distinguish a clean writer shutdown with worker crash/termination from unexplained record loss.
133
+ - In mixed shutdown rows, `attempted` can be lower than `accepted` because a crashed worker may enqueue records before it can report its local attempted count via DETACH. `clean_with_worker_crash` and `snapshot_complete=false` mark that attempted-side worker accounting is incomplete.
133
134
  - In sink-unavailable scenarios, D-SafeLogger classifies rejected records as known sink rejects rather than reporting ambiguous loss.
134
135
  - This is the core multiprocess claim: D-SafeLogger does not promise impossible failure-free logging; it promises explicit accounting of what happened.
135
136
 
137
+ ### Console-less Observability
138
+
139
+ The resilience benchmark now reads D-SafeLogger delivery state through the public `dsafelogger.mp.GetDeliveryStatus()` API instead of a Writer runtime private method. The benchmark records the public accounting schema, including `writer_reject_breakdown`, `worker_drop_breakdown`, `writer_drop_breakdown`, and `partial_delivered` as a separate non-reject category.
140
+
141
+ `partial_delivered` is a third terminal state: it is neither `delivered` (all required sinks succeeded) nor `known_rejected` (zero required sinks succeeded). The writer-side invariant is `accepted = delivered + partial_delivered + known_rejected + writer_known_dropped + unexplained_lost`.
142
+
143
+ For new resilience sessions, D-SafeLogger also enables `runtime_warning_path` and `shutdown_report_path` in the benchmark scratch directory. Runtime warnings are emitted to an independent JSON Lines sink, and shutdown reports provide an atomic final snapshot for post-run diagnosis without requiring console output. Workers that cannot reach the Writer warning IPC path fall back to per-pid local files named `<runtime_warning_path>.<pid>.fallback.jsonl`; console-less deployments should collect both the primary warning file and any fallback files.
144
+
145
+ See [`docs/design/v23k_supplements/delivery_status_schema.md`](docs/design/v23k_supplements/delivery_status_schema.md) for the authoritative accounting contract.
146
+
136
147
  ## What To Claim
137
148
 
138
149
  - D-SafeLogger has zero runtime dependencies.
@@ -141,6 +152,7 @@ Interpretation:
141
152
  - D-SafeLogger async is competitive in single-process logging and leads several low-latency cells in the selected benchmark.
142
153
  - D-SafeLogger multiprocess mode centralizes sink ownership in a Writer runtime.
143
154
  - D-SafeLogger multiprocess resilience profiling exposes classified delivery-state counters: attempted, accepted, delivered, known rejected, known dropped, and unexplained lost.
155
+ - D-SafeLogger multiprocess observability can be consumed without console output through `GetDeliveryStatus()`, runtime warning JSON Lines, and shutdown report JSON.
144
156
 
145
157
  ## What Not To Claim
146
158
 
@@ -7,6 +7,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.3.0] - 2026-05-23
11
+
12
+ ### Added
13
+ - Multiprocess observability artifacts: `mp.GetDeliveryStatus()` / `DeliveryStatus`, `runtime_warning_path` JSON Lines output with per-pid worker fallback files, and `shutdown_report_path` JSON shutdown reports.
14
+ - Tests for runtime warning output, shutdown report generation, public delivery-status snapshots, writer/worker accounting invariants, and runtime-vs-shutdown missing-detach semantics.
15
+ - v23k public design documents and supplements for delivery status schema, runtime warning design, and multiprocess observability test coverage.
16
+
17
+ ### Changed
18
+ - Multiprocess resilience benchmark summaries now use the public `mp.GetDeliveryStatus()` schema, keep `partial_delivered` separate from `known_rejected`, include writer/worker drop/reject breakdowns, and record runtime warning fallback files plus shutdown-report crash fields.
19
+ - Public multiprocess docs now describe console-less observability through status snapshots, runtime warning JSON Lines, and shutdown report JSON instead of relying on stderr-only guidance.
20
+
10
21
  ## [0.2.2] - 2026-05-21
11
22
 
12
23
  ### Added
@@ -27,8 +27,8 @@ include benchmarks/results/benchmarks_multi_integ_20260506_185947/summary.json
27
27
  include benchmarks/results/benchmarks_multi_integ_20260506_185947/summary.md
28
28
  include benchmarks/results/benchmarks_multi_perf_20260506_190518/summary.json
29
29
  include benchmarks/results/benchmarks_multi_perf_20260506_190518/summary.md
30
- include benchmarks/results/benchmarks_multi_resilience_20260506_211129/summary.json
31
- include benchmarks/results/benchmarks_multi_resilience_20260506_211129/summary.md
30
+ include benchmarks/results/benchmarks_multi_resilience_20260523_084326/summary.json
31
+ include benchmarks/results/benchmarks_multi_resilience_20260523_084326/summary.md
32
32
 
33
33
  prune .claude
34
34
  prune .github
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: D-SafeLogger
3
- Version: 0.2.2
3
+ Version: 0.3.0
4
4
  Summary: Zero-dependency, thread-safe, append-only logging library for Python with 3-layer config pipeline
5
5
  Author: D
6
6
  License-Expression: Apache-2.0
@@ -31,19 +31,37 @@ Dynamic: license-file
31
31
  [![PyPI version](https://img.shields.io/pypi/v/d-safelogger.svg?cacheSeconds=3600)](https://pypi.org/project/d-safelogger/)
32
32
  [![Python](https://img.shields.io/pypi/pyversions/d-safelogger.svg?cacheSeconds=3600)](https://pypi.org/project/d-safelogger/)
33
33
  [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)
34
- [![Zero Dependencies](https://img.shields.io/badge/dependencies-zero-brightgreen.svg)](#main-features)
34
+ [![Zero Dependencies](https://img.shields.io/badge/dependencies-zero-brightgreen.svg)](#highlights)
35
35
 
36
36
  Languages: [English](README.md) | [日本語](README_ja.md)
37
37
 
38
- ## Overview
39
-
40
38
  D-SafeLogger is a zero-dependency, stdlib logging-compatible logger built on Python's standard `logging` module.
41
39
 
42
- It extends the standard logging path instead of replacing it. Existing `logging.getLogger()` and `logger.info()` call sites can participate without modification, while D-SafeLogger adds append-only file routing, structured JSON Lines output, contextual logging, SHA-256 sidecars, environment-based operational overrides, and Writer-owned multiprocess logging.
40
+ It extends the standard logging path instead of replacing it, so existing application code and third-party library logs can stay on the stdlib logging path. It is intended for Python applications that need local file logging to start small in development and become explicit, inspectable, and operationally controlled for services, scheduled jobs, audit-oriented logs, and multiprocess workers.
41
+
42
+ ## Highlights
43
+
44
+ 1. **Stdlib `logging` compatible.** Existing `logger.info()` call sites and third-party libraries using `logging.getLogger()` participate without modification.
45
+
46
+ 2. **Append-only routing, no rename.** D-SafeLogger opens the next destination file instead of renaming or truncating the active log. This avoids the Windows file-lock failure mode of rename-based rotation and the POSIX case where a successful rename can leave the writer attached to the previous file descriptor.
47
+
48
+ 3. **Zero runtime dependencies.** The runtime package uses only the Python standard library. No extra runtime dependency chain is added to your application.
43
49
 
44
- Append-only routing means D-SafeLogger opens the next destination file instead of renaming or truncating the active log file. This avoids the common Windows file-lock failure mode of rename-based rotation. It also sidesteps the POSIX failure mode where a rename succeeds at the filesystem layer while existing file descriptors keep writing to the previous file.
50
+ 4. **Start in three lines, add policy through configuration.** A minimal setup is three lines. The same call sites can stay in place while configuration adds 9 routing strategies (`daily`, `hourly`, `size`, and more), JSON Lines, SHA-256 sidecars and manifests, sensitive-keyword masking, diagnostic mode, and code / INI-dict / environment deployment layers.
45
51
 
46
- The "Safe" in the name refers to operational safety: fail-fast setup, append-only file handling, producer-side context snapshots, bounded queues, explicit timeouts, and classified delivery-state accounting.
52
+ 5. **Robust and flexible multiprocess logging.** A parent-side Writer owns file output while workers submit records over IPC. Process, Pool, and ProcessPoolExecutor patterns are covered, with delivery outcomes classified instead of hidden.
53
+
54
+ ## When to Use It
55
+
56
+ Use D-SafeLogger when you want to keep standard `logging.getLogger()` call sites while adding:
57
+
58
+ - append-only local file routing,
59
+ - environment-driven operational overrides,
60
+ - optional SHA-256 sidecars and manifests,
61
+ - Writer-owned multiprocess file output,
62
+ - classified delivery-state accounting.
63
+
64
+ You probably do not need it if your application only writes to stdout/stderr and an external collector owns routing, retention, aggregation, and durability.
47
65
 
48
66
  ## Installation
49
67
 
@@ -90,43 +108,36 @@ For multiprocess setup, see [Multiprocess Logging](#multiprocess-logging). For I
90
108
 
91
109
  Configuration is fail-fast. D-SafeLogger rejects feature combinations that cannot take effect, such as cyclic routing with hash/archive retention, `routing_mode='none'` with D-SafeLogger-owned retention, or `structured=True` with custom formatter strings.
92
110
 
93
- ## When to Use It
94
-
95
- Use D-SafeLogger when you want to keep standard `logging.getLogger()` call sites while adding:
96
-
97
- - append-only local file routing,
98
- - environment-driven operational overrides,
99
- - optional SHA-256 sidecars and manifests,
100
- - Writer-owned multiprocess file output,
101
- - classified delivery-state accounting.
102
-
103
- You probably do not need it if your application only writes to stdout/stderr and an external collector owns routing, retention, aggregation, and durability.
104
-
105
111
  ## Why D-SafeLogger?
106
112
 
107
- D-SafeLogger extends the standard logging path rather than replacing it: you keep using `logging.getLogger()` and existing `logger.info()` call sites, and the library adds safe local-file output on top: rename-free append-only routing, fail-fast configuration, SHA-256 sidecars, sensitive-data masking, environment-driven operational control, and a parent-side multiprocess Writer.
113
+ D-SafeLogger extends the standard logging path rather than replacing it: you keep using `logging.getLogger()` and existing `logger.info()` call sites, and the library adds safe local-file output on top.
108
114
 
109
- If you already use `structlog` as a structured-logging frontend, D-SafeLogger coexists rather than replaces. `structlog` builds the event dictionary; D-SafeLogger handles file output, routing, sidecars, masking, and operational control. See [Structlog Coexistence](examples/16_structlog_coexistence.md) for two integration patterns.
115
+ That matters when an application already has stdlib logging calls, or depends on libraries that emit through `logging.getLogger()`. D-SafeLogger lets those records enter the same routing, formatting, context, integrity, async, and multiprocess Writer path without forcing a new application-wide logging API.
116
+
117
+ If you already use `structlog` as a structured-logging frontend, D-SafeLogger coexists rather than replaces it. `structlog` builds the event dictionary; D-SafeLogger handles file output, routing, sidecars, masking, and operational control. See [Structlog Coexistence](examples/16_structlog_coexistence.md) for two integration patterns.
110
118
 
111
119
  ## Why Routing Instead of External Rotation?
112
120
 
113
121
  External rotation typically renames or truncates an active log file, creates a replacement, and asks the application to reopen its sink. That is plumbing for a design that mutates the active file after the fact, not the core of writing log records.
114
122
 
115
- On POSIX systems, the rename can succeed even while the writer keeps writing through the old file descriptor. The filesystem call returned success, but the logger never actually moved to the new file.
123
+ On Windows, active-file rename can fail because the writer still holds the file. On POSIX systems, the rename can succeed while the writer keeps writing through the old file descriptor. The filesystem call returned success, but the logger never actually moved to the new file.
116
124
 
117
125
  D-SafeLogger avoids that dependency by choosing the destination at write time. It opens the next destination at the routing boundary instead of mutating the active file and relying on a signal/reopen handshake.
118
126
 
119
127
  ## What "Safe" Means
120
128
 
121
- The "Safe" in the name is a design stance that runs across several dimensions of everyday operation, not only failure handling:
129
+ "Safe" is not a promise that every record survives every possible failure. It is a design stance for reducing avoidable logging failures and making observable failures explainable.
130
+
131
+ | Dimension | Meaning |
132
+ |---|---|
133
+ | Startup safety | Invalid settings, inconsistent options, and unwritable destinations fail during setup before the application starts doing real work. |
134
+ | File safety | Routed log files are treated as append-only artifacts with an explicit lifecycle: active writing, closed routed file, optional SHA-256 sidecar, optional manifest, and downstream transfer or archive. Integrity support is for closed-file verification, not access control. |
135
+ | Record and context safety | Context is snapshotted on the producer side at hand-off; diagnostics and Writer-side formatting use the sensitive-keyword set established at configure time. |
136
+ | Operational control | Runtime overrides are intentionally explicit and operator-owned. Log levels, routing, hashing, and timeout behavior can be changed without rebuilding, while diagnostic local-variable expansion is limited to environment-variable opt-in and cannot be enabled by an unowned INI file. |
137
+ | Concurrency and multiprocess safety | Cross-thread and cross-process logging paths use bounded queues, explicit timeouts, rejection/drop paths, and shutdown drain limits. The design favors hard ceilings over indefinite waiting. |
138
+ | Delivery visibility | Abnormal delivery outcomes remain visible through `mp.GetDeliveryStatus()`, runtime warning JSON Lines, and shutdown report JSON. Even `UnexplainedLost` is preserved as an explicit state, so abnormal runs do not collapse into “the file is just shorter than expected.” |
122
139
 
123
- - **Startup safety:** invalid settings, inconsistent options, and unwritable destinations fail during setup. D-SafeLogger stops a broken logging configuration before the application starts doing real work, instead of silently degrading later.
124
- - **File safety:** the routing layer opens the next destination instead of renaming or truncating the active log file, which avoids the common Windows failure mode where active log files cannot be renamed. It also avoids the POSIX case where a successful rename leaves the writer appending to the previous file. Routed files can be paired with SHA-256 sidecars and an optional manifest, so log content is verifiable after the fact.
125
- - **Record and context safety:** request IDs, user IDs, job IDs, and other context are snapshotted on the producer side at hand-off, so listeners and Writers do not depend on live `contextvars`. Diagnostic local-variable snapshots and Writer-side formatting use the sensitive-keyword set established at configure time.
126
- - **Operational control:** environment variables provide explicit runtime overrides for diagnostics, routing, hashing, log levels, and queue/timeout behavior without rebuilding or editing application code.
127
- - **Concurrency and multiprocess safety:** multiprocess workers do not open the shared log files themselves. A parent-side Writer owns the sinks and accepts records over IPC, with bounded queues and explicit timeouts that keep the host process from unbounded waits.
128
- - **Failure observability:** when records cannot be delivered, the runtime classifies the outcome where it can: `KnownRejected`, `KnownDropped`, or `UnexplainedLost`. Counters and shutdown summaries make abnormal scenarios describable rather than silent.
129
- - **Filesystem scope:** append-only routing avoids external rename/truncate of active log files. It does not make every destination filesystem equally safe. NFS, SMB/CIFS, FUSE mounts, cloud-synced folders, container bind mounts, and in-memory filesystems can have different rename, unlink, cache, durability, or lifetime semantics. For audit-oriented deployments, prefer writing active logs to a durable local filesystem and transferring closed routed files to archive or network storage.
140
+ Append-only routing avoids external rename/truncate of active log files. It does not make every destination filesystem equally safe. NFS, SMB/CIFS, FUSE mounts, cloud-synced folders, container bind mounts, and in-memory filesystems can have different rename, unlink, cache, durability, or lifetime semantics. For audit-oriented deployments, prefer writing active logs to a durable local filesystem and transferring closed routed files to archive or network storage.
130
141
 
131
142
  ## Feature Comparison
132
143
 
@@ -173,39 +184,21 @@ Notes:
173
184
  - **※9** loguru's `enqueue=True` provides queued, multiprocessing-safe logging, but it is not a parent-side Writer ownership model and does not expose D-SafeLogger-style delivery-state accounting.
174
185
  - **※10** stdlib logging can be assembled into a listener/queue architecture, but this is not a packaged parent-side Writer API.
175
186
 
176
- **Delivery-state accounting** refers to per-record classification (`KnownRejected`, `KnownDropped`, `UnexplainedLost`) exposed through counters and shutdown summaries. See [`examples/12_multiprocess_logging.md`](examples/12_multiprocess_logging.md) and [BENCHMARK.md](BENCHMARK.md).
177
-
178
- ## Main Features
179
-
180
- - **Zero runtime dependencies:** the package uses only the Python standard library at runtime.
181
- - **Stdlib logging compatibility:** existing `logger.info()` calls and libraries that use `logging.getLogger()` participate in the same logging setup.
182
- - **Centralized setup:** replace common `basicConfig()`, `dictConfig()`, formatter, handler, and rotating-file boilerplate with `ConfigureLogger()`.
183
- - **Fail-fast initialization:** invalid configuration and unwritable log destinations fail during setup instead of degrading silently.
184
- - **Append-only file routing:** the routing layer opens the next destination instead of renaming or truncating the active log file. This avoids the common Windows failure mode where active log files cannot be renamed, and it avoids the POSIX case where a writer may continue writing to the previous file after a successful rename.
185
- - **Retention for routed files:** routed files can be kept by `backup_count`; older files can be deleted by the purge worker or ZIP-archived with `archive_mode=True`.
186
- - **Classified delivery state:** loss, reject, and drop events are not treated as invisible file gaps. When records cannot be delivered, the runtime classifies the outcome as known-rejected, known-dropped, or unexplained-lost where applicable.
187
- - **Bounded logging path:** D-SafeLogger uses bounded queues, explicit timeouts, and explicit rejection paths to avoid unbounded logging-side waits in the host process.
188
- - **Structured JSON Lines:** emit log records as JSON fields for log collectors and observability pipelines.
189
- - **Contextual logging:** attach request IDs, user IDs, job IDs, or other context with thread-safe and async-safe propagation. Producer-side context snapshots are taken at hand-off so listeners and Writers do not look up live `contextvars`.
190
- - **Integrity sidecars:** generate SHA-256 sidecars and optional manifest entries for routed log files. This is tamper-evidence for closed files, not an access-control or compliance system.
191
- - **Operational overrides:** change log level, module routing, console output, color, hashing, config file path, and queue/timeout parameters through environment variables, typically to raise diagnostics in production without code changes.
192
- - **Environment-only diagnostic mode:** opt in via `D_LOG_DIAGNOSE=1` for `f_locals` expansion of selected frames; deliberately not exposed through INI or arguments, so it cannot be enabled by an unowned configuration file.
193
- - **Async transport:** opt in to queue-backed logging when application threads should avoid direct sink writes.
194
- - **Custom log levels:** `register_level()` to add named levels alongside the built-in five before `ConfigureLogger()`.
195
- - **External rotation reopen:** `ReopenLogFiles()` and its multiprocess equivalent reopen sinks after external log rotators such as `logrotate`.
196
- - **Delivery-state visibility (multiprocess):** worker logging exposes per-record delivery-state counters and shutdown summaries, so abnormal shutdowns, sink unavailability, and worker crashes are described rather than silent.
187
+ **Delivery-state accounting** refers to per-record classification (`KnownRejected`, `KnownDropped`, `UnexplainedLost`, plus `partial_delivered`) exposed through `mp.GetDeliveryStatus()`, runtime warning JSON Lines, and shutdown report JSON. See [`examples/12_multiprocess_logging.md`](examples/12_multiprocess_logging.md), [`docs/design/v23k_supplements/delivery_status_schema.md`](docs/design/v23k_supplements/delivery_status_schema.md), and [BENCHMARK.md](BENCHMARK.md).
197
188
 
198
189
  ## Multiprocess Logging
199
190
 
200
191
  `dsafelogger.mp` is for applications where multiple worker processes need to send logs to shared destinations without each worker independently opening the same files.
201
192
 
202
- In this mode, a parent-side Writer owns the file sinks. Workers attach to the Writer and submit log records through IPC. This centralizes file ownership and exposes delivery-state counters such as accepted, delivered, rejected, dropped, and unexplained-lost.
193
+ In this mode, a parent-side Writer owns the file sinks. Workers attach to the Writer and submit log records through IPC. This centralizes file ownership and exposes delivery-state counters such as attempted, accepted, delivered, partial-delivered, known-rejected, known-dropped, and unexplained-lost.
194
+
195
+ The public API is designed for three common worker patterns: `multiprocessing.Process`, `multiprocessing.Pool`, and `concurrent.futures.ProcessPoolExecutor`. The same Writer session can be bootstrapped into each pattern through explicit attach calls or the `GetWorkerInitializer()` helper used by pools and executors.
203
196
 
204
- The Writer shutdown path is bounded: it attempts to drain and join within a timeout, emits a visible warning if drain is incomplete, and avoids hanging the host process indefinitely.
197
+ The Writer shutdown path is bounded: it attempts to drain and join within a timeout, records runtime warnings when configured, writes a shutdown report when configured, and avoids hanging the host process indefinitely.
205
198
 
206
199
  For setup code, the `multiprocessing` context rules, pool initializer, `ProcessPoolExecutor` integration, Windows spawn caveats, custom log levels, attach/detach lifecycle, environment-variable knobs, and shutdown handling, see [`examples/12_multiprocess_logging.md`](examples/12_multiprocess_logging.md).
207
200
 
208
- Public API in `dsafelogger.mp`: `ConfigureLogger`, `AttachCurrentProcess`, `DetachCurrentProcess`, `GetLogger`, `GetWorkerInitializer`, `ReopenLogFiles`.
201
+ Public API in `dsafelogger.mp`: `ConfigureLogger`, `AttachCurrentProcess`, `DetachCurrentProcess`, `GetLogger`, `GetWorkerInitializer`, `GetDeliveryStatus`, `DeliveryStatus`, `ReopenLogFiles`.
209
202
 
210
203
  ## Configuration
211
204
 
@@ -222,7 +215,7 @@ Common environment overrides, using the default `D_LOG_*` prefix; the prefix is
222
215
  - Single-process: `D_LOG_LEVEL`, `D_LOG_MODULES`, `D_LOG_CONFIG`, `D_LOG_DIAGNOSE`, `D_LOG_CONSOLE`, `D_LOG_COLOR`, `D_LOG_HASH`, `D_LOG_MANIFEST`, plus the industry-standard `NO_COLOR`, which is not affected by `env_prefix`.
223
216
  - Multiprocess (`dsafelogger.mp`): `D_LOG_IPC_LOG_TIMEOUT`, `D_LOG_IPC_LOG_QUEUE_MAXSIZE`, `D_LOG_IPC_CLIENT_QUEUE_MAXSIZE`, `D_LOG_WRITER_FLUSH_BATCH`. These tune backpressure behavior and are normally left at defaults.
224
217
 
225
- See [Configuration Guide](examples/02_configuration_guide.md) for INI files, dict configuration, module-specific routing, and precedence rules.
218
+ See [Configuration Guide](examples/02_configuration_guide.md) for INI files, dict configuration, module-specific routing, and precedence rules. For routing-mode selection, purge/archive retention, and long-running file lifecycle examples, see [Long-Running Service](examples/07_long_running_service.md).
226
219
 
227
220
  ## Tutorials / Examples
228
221
 
@@ -259,13 +252,13 @@ Suggested reading paths:
259
252
 
260
253
  D-SafeLogger is competitive in the selected single-process async benchmark runs. In multiprocess benchmarks, raw throughput is not the differentiator; parent-side file output and classified delivery-state accounting are.
261
254
 
262
- The benchmark suite also includes multiprocess resilience profiles, such as sink-unavailable, burst backpressure, worker crash, mixed worker behavior, and shutdown behavior. These runs are not throughput claims; they check whether attempted records can be accounted for as delivered, known-rejected, known-dropped, or unexplained-lost.
255
+ The benchmark suite also includes multiprocess resilience profiles, such as sink-unavailable, burst backpressure, worker crash, warning-IPC fallback, mixed worker behavior, and shutdown behavior. These runs are not throughput claims; they check whether attempted records can be accounted for as delivered, partial-delivered, known-rejected, known-dropped, or unexplained-lost.
263
256
 
264
257
  See [BENCHMARK.md](BENCHMARK.md) for the selected runs, methodology, and the explicit "what to claim / what not to claim" boundaries, and [`benchmarks/summary/`](benchmarks/summary/) for the published summaries.
265
258
 
266
259
  ## Testing / Quality
267
260
 
268
- The release gate runs the full dev test suite across Windows, macOS, and Linux on Python 3.11-3.14. CI also runs Ubuntu free-threaded CPython `3.13t` and `3.14t` compatibility jobs with `PYTHON_GIL=0`. Publication checks also verify generated API docs, public design documents, benchmark summaries, and package build output.
261
+ The release gate runs the full dev test suite across Windows, macOS, and Linux on Python 3.11-3.14. CI also runs Ubuntu free-threaded CPython `3.13t` and `3.14t` compatibility jobs with `PYTHON_GIL=0`. Publication checks verify source typing, typing smoke tests, packaged `pyright --verifytypes`, generated API docs, public design documents, benchmark summaries, and package build output.
269
262
 
270
263
  See [TESTING.md](TESTING.md) for details.
271
264
 
@@ -287,8 +280,8 @@ For vulnerability reporting, see [SECURITY.md](SECURITY.md).
287
280
 
288
281
  For deeper architectural rationale and specification details, see:
289
282
 
290
- - [Architecture Analysis White Paper](docs/design/D-SafeLogger_v23j_WhitePaper_en.md)
291
- - [Basic Design Specification](docs/design/D_SafeLogger_Specification_v23j_full_en.md)
283
+ - [Architecture Analysis White Paper](docs/design/D-SafeLogger_v23k_WhitePaper_en.md)
284
+ - [Basic Design Specification](docs/design/D_SafeLogger_Specification_v23k_full_en.md)
292
285
  - [API Reference](docs/api/index.md)
293
286
 
294
287
  Japanese design documents are also available under [`docs/design/`](docs/design/).
@@ -4,19 +4,37 @@
4
4
  [![PyPI version](https://img.shields.io/pypi/v/d-safelogger.svg?cacheSeconds=3600)](https://pypi.org/project/d-safelogger/)
5
5
  [![Python](https://img.shields.io/pypi/pyversions/d-safelogger.svg?cacheSeconds=3600)](https://pypi.org/project/d-safelogger/)
6
6
  [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)
7
- [![Zero Dependencies](https://img.shields.io/badge/dependencies-zero-brightgreen.svg)](#main-features)
7
+ [![Zero Dependencies](https://img.shields.io/badge/dependencies-zero-brightgreen.svg)](#highlights)
8
8
 
9
9
  Languages: [English](README.md) | [日本語](README_ja.md)
10
10
 
11
- ## Overview
12
-
13
11
  D-SafeLogger is a zero-dependency, stdlib logging-compatible logger built on Python's standard `logging` module.
14
12
 
15
- It extends the standard logging path instead of replacing it. Existing `logging.getLogger()` and `logger.info()` call sites can participate without modification, while D-SafeLogger adds append-only file routing, structured JSON Lines output, contextual logging, SHA-256 sidecars, environment-based operational overrides, and Writer-owned multiprocess logging.
13
+ It extends the standard logging path instead of replacing it, so existing application code and third-party library logs can stay on the stdlib logging path. It is intended for Python applications that need local file logging to start small in development and become explicit, inspectable, and operationally controlled for services, scheduled jobs, audit-oriented logs, and multiprocess workers.
14
+
15
+ ## Highlights
16
+
17
+ 1. **Stdlib `logging` compatible.** Existing `logger.info()` call sites and third-party libraries using `logging.getLogger()` participate without modification.
18
+
19
+ 2. **Append-only routing, no rename.** D-SafeLogger opens the next destination file instead of renaming or truncating the active log. This avoids the Windows file-lock failure mode of rename-based rotation and the POSIX case where a successful rename can leave the writer attached to the previous file descriptor.
20
+
21
+ 3. **Zero runtime dependencies.** The runtime package uses only the Python standard library. No extra runtime dependency chain is added to your application.
16
22
 
17
- Append-only routing means D-SafeLogger opens the next destination file instead of renaming or truncating the active log file. This avoids the common Windows file-lock failure mode of rename-based rotation. It also sidesteps the POSIX failure mode where a rename succeeds at the filesystem layer while existing file descriptors keep writing to the previous file.
23
+ 4. **Start in three lines, add policy through configuration.** A minimal setup is three lines. The same call sites can stay in place while configuration adds 9 routing strategies (`daily`, `hourly`, `size`, and more), JSON Lines, SHA-256 sidecars and manifests, sensitive-keyword masking, diagnostic mode, and code / INI-dict / environment deployment layers.
18
24
 
19
- The "Safe" in the name refers to operational safety: fail-fast setup, append-only file handling, producer-side context snapshots, bounded queues, explicit timeouts, and classified delivery-state accounting.
25
+ 5. **Robust and flexible multiprocess logging.** A parent-side Writer owns file output while workers submit records over IPC. Process, Pool, and ProcessPoolExecutor patterns are covered, with delivery outcomes classified instead of hidden.
26
+
27
+ ## When to Use It
28
+
29
+ Use D-SafeLogger when you want to keep standard `logging.getLogger()` call sites while adding:
30
+
31
+ - append-only local file routing,
32
+ - environment-driven operational overrides,
33
+ - optional SHA-256 sidecars and manifests,
34
+ - Writer-owned multiprocess file output,
35
+ - classified delivery-state accounting.
36
+
37
+ You probably do not need it if your application only writes to stdout/stderr and an external collector owns routing, retention, aggregation, and durability.
20
38
 
21
39
  ## Installation
22
40
 
@@ -63,43 +81,36 @@ For multiprocess setup, see [Multiprocess Logging](#multiprocess-logging). For I
63
81
 
64
82
  Configuration is fail-fast. D-SafeLogger rejects feature combinations that cannot take effect, such as cyclic routing with hash/archive retention, `routing_mode='none'` with D-SafeLogger-owned retention, or `structured=True` with custom formatter strings.
65
83
 
66
- ## When to Use It
67
-
68
- Use D-SafeLogger when you want to keep standard `logging.getLogger()` call sites while adding:
69
-
70
- - append-only local file routing,
71
- - environment-driven operational overrides,
72
- - optional SHA-256 sidecars and manifests,
73
- - Writer-owned multiprocess file output,
74
- - classified delivery-state accounting.
75
-
76
- You probably do not need it if your application only writes to stdout/stderr and an external collector owns routing, retention, aggregation, and durability.
77
-
78
84
  ## Why D-SafeLogger?
79
85
 
80
- D-SafeLogger extends the standard logging path rather than replacing it: you keep using `logging.getLogger()` and existing `logger.info()` call sites, and the library adds safe local-file output on top: rename-free append-only routing, fail-fast configuration, SHA-256 sidecars, sensitive-data masking, environment-driven operational control, and a parent-side multiprocess Writer.
86
+ D-SafeLogger extends the standard logging path rather than replacing it: you keep using `logging.getLogger()` and existing `logger.info()` call sites, and the library adds safe local-file output on top.
81
87
 
82
- If you already use `structlog` as a structured-logging frontend, D-SafeLogger coexists rather than replaces. `structlog` builds the event dictionary; D-SafeLogger handles file output, routing, sidecars, masking, and operational control. See [Structlog Coexistence](examples/16_structlog_coexistence.md) for two integration patterns.
88
+ That matters when an application already has stdlib logging calls, or depends on libraries that emit through `logging.getLogger()`. D-SafeLogger lets those records enter the same routing, formatting, context, integrity, async, and multiprocess Writer path without forcing a new application-wide logging API.
89
+
90
+ If you already use `structlog` as a structured-logging frontend, D-SafeLogger coexists rather than replaces it. `structlog` builds the event dictionary; D-SafeLogger handles file output, routing, sidecars, masking, and operational control. See [Structlog Coexistence](examples/16_structlog_coexistence.md) for two integration patterns.
83
91
 
84
92
  ## Why Routing Instead of External Rotation?
85
93
 
86
94
  External rotation typically renames or truncates an active log file, creates a replacement, and asks the application to reopen its sink. That is plumbing for a design that mutates the active file after the fact, not the core of writing log records.
87
95
 
88
- On POSIX systems, the rename can succeed even while the writer keeps writing through the old file descriptor. The filesystem call returned success, but the logger never actually moved to the new file.
96
+ On Windows, active-file rename can fail because the writer still holds the file. On POSIX systems, the rename can succeed while the writer keeps writing through the old file descriptor. The filesystem call returned success, but the logger never actually moved to the new file.
89
97
 
90
98
  D-SafeLogger avoids that dependency by choosing the destination at write time. It opens the next destination at the routing boundary instead of mutating the active file and relying on a signal/reopen handshake.
91
99
 
92
100
  ## What "Safe" Means
93
101
 
94
- The "Safe" in the name is a design stance that runs across several dimensions of everyday operation, not only failure handling:
102
+ "Safe" is not a promise that every record survives every possible failure. It is a design stance for reducing avoidable logging failures and making observable failures explainable.
103
+
104
+ | Dimension | Meaning |
105
+ |---|---|
106
+ | Startup safety | Invalid settings, inconsistent options, and unwritable destinations fail during setup before the application starts doing real work. |
107
+ | File safety | Routed log files are treated as append-only artifacts with an explicit lifecycle: active writing, closed routed file, optional SHA-256 sidecar, optional manifest, and downstream transfer or archive. Integrity support is for closed-file verification, not access control. |
108
+ | Record and context safety | Context is snapshotted on the producer side at hand-off; diagnostics and Writer-side formatting use the sensitive-keyword set established at configure time. |
109
+ | Operational control | Runtime overrides are intentionally explicit and operator-owned. Log levels, routing, hashing, and timeout behavior can be changed without rebuilding, while diagnostic local-variable expansion is limited to environment-variable opt-in and cannot be enabled by an unowned INI file. |
110
+ | Concurrency and multiprocess safety | Cross-thread and cross-process logging paths use bounded queues, explicit timeouts, rejection/drop paths, and shutdown drain limits. The design favors hard ceilings over indefinite waiting. |
111
+ | Delivery visibility | Abnormal delivery outcomes remain visible through `mp.GetDeliveryStatus()`, runtime warning JSON Lines, and shutdown report JSON. Even `UnexplainedLost` is preserved as an explicit state, so abnormal runs do not collapse into “the file is just shorter than expected.” |
95
112
 
96
- - **Startup safety:** invalid settings, inconsistent options, and unwritable destinations fail during setup. D-SafeLogger stops a broken logging configuration before the application starts doing real work, instead of silently degrading later.
97
- - **File safety:** the routing layer opens the next destination instead of renaming or truncating the active log file, which avoids the common Windows failure mode where active log files cannot be renamed. It also avoids the POSIX case where a successful rename leaves the writer appending to the previous file. Routed files can be paired with SHA-256 sidecars and an optional manifest, so log content is verifiable after the fact.
98
- - **Record and context safety:** request IDs, user IDs, job IDs, and other context are snapshotted on the producer side at hand-off, so listeners and Writers do not depend on live `contextvars`. Diagnostic local-variable snapshots and Writer-side formatting use the sensitive-keyword set established at configure time.
99
- - **Operational control:** environment variables provide explicit runtime overrides for diagnostics, routing, hashing, log levels, and queue/timeout behavior without rebuilding or editing application code.
100
- - **Concurrency and multiprocess safety:** multiprocess workers do not open the shared log files themselves. A parent-side Writer owns the sinks and accepts records over IPC, with bounded queues and explicit timeouts that keep the host process from unbounded waits.
101
- - **Failure observability:** when records cannot be delivered, the runtime classifies the outcome where it can: `KnownRejected`, `KnownDropped`, or `UnexplainedLost`. Counters and shutdown summaries make abnormal scenarios describable rather than silent.
102
- - **Filesystem scope:** append-only routing avoids external rename/truncate of active log files. It does not make every destination filesystem equally safe. NFS, SMB/CIFS, FUSE mounts, cloud-synced folders, container bind mounts, and in-memory filesystems can have different rename, unlink, cache, durability, or lifetime semantics. For audit-oriented deployments, prefer writing active logs to a durable local filesystem and transferring closed routed files to archive or network storage.
113
+ Append-only routing avoids external rename/truncate of active log files. It does not make every destination filesystem equally safe. NFS, SMB/CIFS, FUSE mounts, cloud-synced folders, container bind mounts, and in-memory filesystems can have different rename, unlink, cache, durability, or lifetime semantics. For audit-oriented deployments, prefer writing active logs to a durable local filesystem and transferring closed routed files to archive or network storage.
103
114
 
104
115
  ## Feature Comparison
105
116
 
@@ -146,39 +157,21 @@ Notes:
146
157
  - **※9** loguru's `enqueue=True` provides queued, multiprocessing-safe logging, but it is not a parent-side Writer ownership model and does not expose D-SafeLogger-style delivery-state accounting.
147
158
  - **※10** stdlib logging can be assembled into a listener/queue architecture, but this is not a packaged parent-side Writer API.
148
159
 
149
- **Delivery-state accounting** refers to per-record classification (`KnownRejected`, `KnownDropped`, `UnexplainedLost`) exposed through counters and shutdown summaries. See [`examples/12_multiprocess_logging.md`](examples/12_multiprocess_logging.md) and [BENCHMARK.md](BENCHMARK.md).
150
-
151
- ## Main Features
152
-
153
- - **Zero runtime dependencies:** the package uses only the Python standard library at runtime.
154
- - **Stdlib logging compatibility:** existing `logger.info()` calls and libraries that use `logging.getLogger()` participate in the same logging setup.
155
- - **Centralized setup:** replace common `basicConfig()`, `dictConfig()`, formatter, handler, and rotating-file boilerplate with `ConfigureLogger()`.
156
- - **Fail-fast initialization:** invalid configuration and unwritable log destinations fail during setup instead of degrading silently.
157
- - **Append-only file routing:** the routing layer opens the next destination instead of renaming or truncating the active log file. This avoids the common Windows failure mode where active log files cannot be renamed, and it avoids the POSIX case where a writer may continue writing to the previous file after a successful rename.
158
- - **Retention for routed files:** routed files can be kept by `backup_count`; older files can be deleted by the purge worker or ZIP-archived with `archive_mode=True`.
159
- - **Classified delivery state:** loss, reject, and drop events are not treated as invisible file gaps. When records cannot be delivered, the runtime classifies the outcome as known-rejected, known-dropped, or unexplained-lost where applicable.
160
- - **Bounded logging path:** D-SafeLogger uses bounded queues, explicit timeouts, and explicit rejection paths to avoid unbounded logging-side waits in the host process.
161
- - **Structured JSON Lines:** emit log records as JSON fields for log collectors and observability pipelines.
162
- - **Contextual logging:** attach request IDs, user IDs, job IDs, or other context with thread-safe and async-safe propagation. Producer-side context snapshots are taken at hand-off so listeners and Writers do not look up live `contextvars`.
163
- - **Integrity sidecars:** generate SHA-256 sidecars and optional manifest entries for routed log files. This is tamper-evidence for closed files, not an access-control or compliance system.
164
- - **Operational overrides:** change log level, module routing, console output, color, hashing, config file path, and queue/timeout parameters through environment variables, typically to raise diagnostics in production without code changes.
165
- - **Environment-only diagnostic mode:** opt in via `D_LOG_DIAGNOSE=1` for `f_locals` expansion of selected frames; deliberately not exposed through INI or arguments, so it cannot be enabled by an unowned configuration file.
166
- - **Async transport:** opt in to queue-backed logging when application threads should avoid direct sink writes.
167
- - **Custom log levels:** `register_level()` to add named levels alongside the built-in five before `ConfigureLogger()`.
168
- - **External rotation reopen:** `ReopenLogFiles()` and its multiprocess equivalent reopen sinks after external log rotators such as `logrotate`.
169
- - **Delivery-state visibility (multiprocess):** worker logging exposes per-record delivery-state counters and shutdown summaries, so abnormal shutdowns, sink unavailability, and worker crashes are described rather than silent.
160
+ **Delivery-state accounting** refers to per-record classification (`KnownRejected`, `KnownDropped`, `UnexplainedLost`, plus `partial_delivered`) exposed through `mp.GetDeliveryStatus()`, runtime warning JSON Lines, and shutdown report JSON. See [`examples/12_multiprocess_logging.md`](examples/12_multiprocess_logging.md), [`docs/design/v23k_supplements/delivery_status_schema.md`](docs/design/v23k_supplements/delivery_status_schema.md), and [BENCHMARK.md](BENCHMARK.md).
170
161
 
171
162
  ## Multiprocess Logging
172
163
 
173
164
  `dsafelogger.mp` is for applications where multiple worker processes need to send logs to shared destinations without each worker independently opening the same files.
174
165
 
175
- In this mode, a parent-side Writer owns the file sinks. Workers attach to the Writer and submit log records through IPC. This centralizes file ownership and exposes delivery-state counters such as accepted, delivered, rejected, dropped, and unexplained-lost.
166
+ In this mode, a parent-side Writer owns the file sinks. Workers attach to the Writer and submit log records through IPC. This centralizes file ownership and exposes delivery-state counters such as attempted, accepted, delivered, partial-delivered, known-rejected, known-dropped, and unexplained-lost.
167
+
168
+ The public API is designed for three common worker patterns: `multiprocessing.Process`, `multiprocessing.Pool`, and `concurrent.futures.ProcessPoolExecutor`. The same Writer session can be bootstrapped into each pattern through explicit attach calls or the `GetWorkerInitializer()` helper used by pools and executors.
176
169
 
177
- The Writer shutdown path is bounded: it attempts to drain and join within a timeout, emits a visible warning if drain is incomplete, and avoids hanging the host process indefinitely.
170
+ The Writer shutdown path is bounded: it attempts to drain and join within a timeout, records runtime warnings when configured, writes a shutdown report when configured, and avoids hanging the host process indefinitely.
178
171
 
179
172
  For setup code, the `multiprocessing` context rules, pool initializer, `ProcessPoolExecutor` integration, Windows spawn caveats, custom log levels, attach/detach lifecycle, environment-variable knobs, and shutdown handling, see [`examples/12_multiprocess_logging.md`](examples/12_multiprocess_logging.md).
180
173
 
181
- Public API in `dsafelogger.mp`: `ConfigureLogger`, `AttachCurrentProcess`, `DetachCurrentProcess`, `GetLogger`, `GetWorkerInitializer`, `ReopenLogFiles`.
174
+ Public API in `dsafelogger.mp`: `ConfigureLogger`, `AttachCurrentProcess`, `DetachCurrentProcess`, `GetLogger`, `GetWorkerInitializer`, `GetDeliveryStatus`, `DeliveryStatus`, `ReopenLogFiles`.
182
175
 
183
176
  ## Configuration
184
177
 
@@ -195,7 +188,7 @@ Common environment overrides, using the default `D_LOG_*` prefix; the prefix is
195
188
  - Single-process: `D_LOG_LEVEL`, `D_LOG_MODULES`, `D_LOG_CONFIG`, `D_LOG_DIAGNOSE`, `D_LOG_CONSOLE`, `D_LOG_COLOR`, `D_LOG_HASH`, `D_LOG_MANIFEST`, plus the industry-standard `NO_COLOR`, which is not affected by `env_prefix`.
196
189
  - Multiprocess (`dsafelogger.mp`): `D_LOG_IPC_LOG_TIMEOUT`, `D_LOG_IPC_LOG_QUEUE_MAXSIZE`, `D_LOG_IPC_CLIENT_QUEUE_MAXSIZE`, `D_LOG_WRITER_FLUSH_BATCH`. These tune backpressure behavior and are normally left at defaults.
197
190
 
198
- See [Configuration Guide](examples/02_configuration_guide.md) for INI files, dict configuration, module-specific routing, and precedence rules.
191
+ See [Configuration Guide](examples/02_configuration_guide.md) for INI files, dict configuration, module-specific routing, and precedence rules. For routing-mode selection, purge/archive retention, and long-running file lifecycle examples, see [Long-Running Service](examples/07_long_running_service.md).
199
192
 
200
193
  ## Tutorials / Examples
201
194
 
@@ -232,13 +225,13 @@ Suggested reading paths:
232
225
 
233
226
  D-SafeLogger is competitive in the selected single-process async benchmark runs. In multiprocess benchmarks, raw throughput is not the differentiator; parent-side file output and classified delivery-state accounting are.
234
227
 
235
- The benchmark suite also includes multiprocess resilience profiles, such as sink-unavailable, burst backpressure, worker crash, mixed worker behavior, and shutdown behavior. These runs are not throughput claims; they check whether attempted records can be accounted for as delivered, known-rejected, known-dropped, or unexplained-lost.
228
+ The benchmark suite also includes multiprocess resilience profiles, such as sink-unavailable, burst backpressure, worker crash, warning-IPC fallback, mixed worker behavior, and shutdown behavior. These runs are not throughput claims; they check whether attempted records can be accounted for as delivered, partial-delivered, known-rejected, known-dropped, or unexplained-lost.
236
229
 
237
230
  See [BENCHMARK.md](BENCHMARK.md) for the selected runs, methodology, and the explicit "what to claim / what not to claim" boundaries, and [`benchmarks/summary/`](benchmarks/summary/) for the published summaries.
238
231
 
239
232
  ## Testing / Quality
240
233
 
241
- The release gate runs the full dev test suite across Windows, macOS, and Linux on Python 3.11-3.14. CI also runs Ubuntu free-threaded CPython `3.13t` and `3.14t` compatibility jobs with `PYTHON_GIL=0`. Publication checks also verify generated API docs, public design documents, benchmark summaries, and package build output.
234
+ The release gate runs the full dev test suite across Windows, macOS, and Linux on Python 3.11-3.14. CI also runs Ubuntu free-threaded CPython `3.13t` and `3.14t` compatibility jobs with `PYTHON_GIL=0`. Publication checks verify source typing, typing smoke tests, packaged `pyright --verifytypes`, generated API docs, public design documents, benchmark summaries, and package build output.
242
235
 
243
236
  See [TESTING.md](TESTING.md) for details.
244
237
 
@@ -260,8 +253,8 @@ For vulnerability reporting, see [SECURITY.md](SECURITY.md).
260
253
 
261
254
  For deeper architectural rationale and specification details, see:
262
255
 
263
- - [Architecture Analysis White Paper](docs/design/D-SafeLogger_v23j_WhitePaper_en.md)
264
- - [Basic Design Specification](docs/design/D_SafeLogger_Specification_v23j_full_en.md)
256
+ - [Architecture Analysis White Paper](docs/design/D-SafeLogger_v23k_WhitePaper_en.md)
257
+ - [Basic Design Specification](docs/design/D_SafeLogger_Specification_v23k_full_en.md)
265
258
  - [API Reference](docs/api/index.md)
266
259
 
267
260
  Japanese design documents are also available under [`docs/design/`](docs/design/).