agent-lifecycle-kit 1.76.0__tar.gz → 1.78.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 (360) hide show
  1. {agent_lifecycle_kit-1.76.0/src/agent_lifecycle_kit.egg-info → agent_lifecycle_kit-1.78.0}/PKG-INFO +4 -4
  2. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/README.md +3 -3
  3. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/pyproject.toml +29 -7
  4. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/__init__.py +1 -1
  5. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/_version.py +1 -1
  6. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/adapter_sessions/launch_execution.py +12 -108
  7. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/adapter_sessions/launch_preflight.py +19 -17
  8. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/adapter_sessions/planning_session.py +6 -5
  9. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/adapter_sessions/process_groups.py +65 -17
  10. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/adapter_sessions/process_telemetry.py +44 -14
  11. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/adapter_sessions/unified_start.py +101 -49
  12. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/adapter_sessions/workflow_bridge.py +22 -14
  13. agent_lifecycle_kit-1.78.0/src/agent_lifecycle/adapter_sessions/worktree_identity.py +189 -0
  14. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/audit/proof_integrity.py +15 -1
  15. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/benchmarks/reporting.py +26 -12
  16. agent_lifecycle_kit-1.78.0/src/agent_lifecycle/cli/command_registry.py +41 -0
  17. agent_lifecycle_kit-1.78.0/src/agent_lifecycle/cli/dispatch.py +88 -0
  18. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/cli/dispatch_planning.py +15 -14
  19. agent_lifecycle_kit-1.78.0/src/agent_lifecycle/cli/errors.py +29 -0
  20. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/cli/lifecycle_parsers.py +17 -5
  21. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/cli/main.py +11 -5
  22. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/cli/metrics_parser.py +9 -3
  23. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/cli/observability_parsers.py +1 -0
  24. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/cli/parsers.py +46 -21
  25. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/cli/planning_parsers.py +7 -1
  26. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/cli/policy.py +7 -3
  27. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/compiler/small_model_packets.py +20 -4
  28. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/context/checkpoint_store.py +19 -9
  29. agent_lifecycle_kit-1.78.0/src/agent_lifecycle/contracts/performance_limits.py +181 -0
  30. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/thread_bridge_schema_definitions.py +9 -5
  31. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/thread_bridge_schemas.py +71 -21
  32. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/thread_bridge_validation.py +26 -14
  33. agent_lifecycle_kit-1.78.0/src/agent_lifecycle/data/__init__.py +1 -0
  34. agent_lifecycle_kit-1.78.0/src/agent_lifecycle/data/profiles/lifecycle-baselines.v1.json +70 -0
  35. agent_lifecycle_kit-1.78.0/src/agent_lifecycle/data/profiles/model-routing-profile.v1.json +103 -0
  36. agent_lifecycle_kit-1.78.0/src/agent_lifecycle/data/profiles/risk-execution-policy.v1.json +21 -0
  37. agent_lifecycle_kit-1.78.0/src/agent_lifecycle/data/profiles/small-context-profile.v1.json +126 -0
  38. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/diagnostics/readiness.py +66 -17
  39. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/goal/view.py +7 -5
  40. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/imports/planning.py +19 -9
  41. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/metrics/cost_collection.py +8 -10
  42. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/model_routing/resolver.py +51 -23
  43. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/neutrality/canonical.py +2 -0
  44. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/neutrality/ed25519.py +59 -24
  45. agent_lifecycle_kit-1.78.0/src/agent_lifecycle/neutrality/git_objects.py +177 -0
  46. agent_lifecycle_kit-1.78.0/src/agent_lifecycle/neutrality/matching.py +95 -0
  47. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/neutrality/scanner.py +34 -82
  48. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/policy/quality_floor.py +13 -2
  49. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/project/presets.py +13 -11
  50. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/reporting/usage_export.py +9 -4
  51. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/research/provenance.py +12 -7
  52. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/research/validation.py +56 -23
  53. agent_lifecycle_kit-1.78.0/src/agent_lifecycle/resources.py +60 -0
  54. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/runner/attempt_snapshots.py +45 -13
  55. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/specification/completion_check.py +7 -2
  56. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/workflow/leases.py +24 -7
  57. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0/src/agent_lifecycle_kit.egg-info}/PKG-INFO +4 -4
  58. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle_kit.egg-info/SOURCES.txt +15 -3
  59. agent_lifecycle_kit-1.76.0/src/agent_lifecycle/cli/dispatch.py +0 -59
  60. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/LICENSE +0 -0
  61. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/NOTICE +0 -0
  62. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/benchmarks/reference-tasks/README.md +0 -0
  63. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/benchmarks/reference-tasks/manifest.json +0 -0
  64. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/benchmarks/reference-tasks/rt01-planning/oracle.json +0 -0
  65. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/benchmarks/reference-tasks/rt01-planning/task.md +0 -0
  66. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/benchmarks/reference-tasks/rt02-architecture-review/oracle.json +0 -0
  67. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/benchmarks/reference-tasks/rt02-architecture-review/task.md +0 -0
  68. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/benchmarks/reference-tasks/rt03-bug-forensics/oracle.json +0 -0
  69. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/benchmarks/reference-tasks/rt03-bug-forensics/task.md +0 -0
  70. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/benchmarks/reference-tasks/rt04-s1-managed-task/oracle.json +0 -0
  71. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/benchmarks/reference-tasks/rt04-s1-managed-task/task.md +0 -0
  72. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/benchmarks/reference-tasks/rt05-s2-evidence-task/oracle.json +0 -0
  73. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/benchmarks/reference-tasks/rt05-s2-evidence-task/task.md +0 -0
  74. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/setup.cfg +0 -0
  75. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/__main__.py +0 -0
  76. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/adapter_sessions/__init__.py +0 -0
  77. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/adapter_sessions/agent_plugin_probe.py +0 -0
  78. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/adapter_sessions/contracts.py +0 -0
  79. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/adapter_sessions/env.py +0 -0
  80. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/adapter_sessions/launcher.py +0 -0
  81. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/adapter_sessions/local_launch_profile.py +0 -0
  82. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/adapter_sessions/planning_launch.py +0 -0
  83. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/adapter_sessions/process.py +0 -0
  84. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/adapter_sessions/process_capture.py +0 -0
  85. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/adapter_sessions/process_control.py +0 -0
  86. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/adapter_sessions/qualification.py +0 -0
  87. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/adapter_sessions/redaction.py +0 -0
  88. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/adapter_sessions/session_store.py +0 -0
  89. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/adapter_sessions/start_input.py +0 -0
  90. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/adapter_sessions/start_receipts.py +0 -0
  91. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/adapter_sessions/start_routing.py +0 -0
  92. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/adapter_sessions/task_intake.py +0 -0
  93. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/audit/__init__.py +0 -0
  94. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/audit/bug_forensics.py +0 -0
  95. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/audit/implementation.py +0 -0
  96. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/audit/ownership.py +0 -0
  97. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/audit/package.py +0 -0
  98. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/audit/proof_chain.py +0 -0
  99. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/audit/proof_findings.py +0 -0
  100. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/audit/review_verdict.py +0 -0
  101. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/benchmarks/__init__.py +0 -0
  102. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/benchmarks/comparison.py +0 -0
  103. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/benchmarks/contracts.py +0 -0
  104. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/benchmarks/evaluator.py +0 -0
  105. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/benchmarks/oracles.py +0 -0
  106. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/benchmarks/qualification.py +0 -0
  107. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/benchmarks/stratification.py +0 -0
  108. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/changesets/__init__.py +0 -0
  109. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/changesets/git.py +0 -0
  110. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/cli/__init__.py +0 -0
  111. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/cli/adapter.py +0 -0
  112. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/cli/benchmarks.py +0 -0
  113. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/cli/dispatch_adapters.py +0 -0
  114. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/cli/dispatch_contracts.py +0 -0
  115. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/cli/dispatch_lifecycle.py +0 -0
  116. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/cli/dispatch_metrics.py +0 -0
  117. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/cli/dispatch_observability.py +0 -0
  118. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/cli/dispatch_research.py +0 -0
  119. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/cli/followup.py +0 -0
  120. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/cli/host_launch.py +0 -0
  121. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/cli/progress_hooks.py +0 -0
  122. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/cli/project.py +0 -0
  123. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/cli/research.py +0 -0
  124. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/cli/start.py +0 -0
  125. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/cli/strategy.py +0 -0
  126. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/cli/worktree.py +0 -0
  127. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/compiler/__init__.py +0 -0
  128. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/compiler/task_packets.py +0 -0
  129. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/context/__init__.py +0 -0
  130. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/context/checkpoints.py +0 -0
  131. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/context/episode_retrieval.py +0 -0
  132. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/context/external_memory.py +0 -0
  133. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/context/profiles.py +0 -0
  134. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/context/rendering.py +0 -0
  135. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/context/thread_bridge_context.py +0 -0
  136. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/__init__.py +0 -0
  137. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/adapter_contract_schemas.py +0 -0
  138. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/adapter_event_schemas.py +0 -0
  139. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/adapter_session_schemas.py +0 -0
  140. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/adapter_task_schemas.py +0 -0
  141. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/agent_plugin_qualification_schemas.py +0 -0
  142. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/audit_optimization_schemas.py +0 -0
  143. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/audit_schemas.py +0 -0
  144. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/benchmark_schemas.py +0 -0
  145. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/bug_forensics_schemas.py +0 -0
  146. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/canonical.py +0 -0
  147. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/compatibility.py +0 -0
  148. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/context_checkpoint_schemas.py +0 -0
  149. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/context_model_schemas.py +0 -0
  150. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/core_schemas.py +0 -0
  151. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/cross_check_schemas.py +0 -0
  152. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/errors.py +0 -0
  153. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/evidence_import_schemas.py +0 -0
  154. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/execution_strategy_schemas.py +0 -0
  155. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/goal_validation.py +0 -0
  156. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/host_capability_schemas.py +0 -0
  157. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/implementation_audit_validation.py +0 -0
  158. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/import_dialect_schemas.py +0 -0
  159. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/launch_qualification.py +0 -0
  160. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/local_launch_validation.py +0 -0
  161. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/metric_schemas.py +0 -0
  162. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/paths.py +0 -0
  163. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/persistence.py +0 -0
  164. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/plan_contract_schemas.py +0 -0
  165. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/plan_delta_schemas.py +0 -0
  166. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/planning_launch_schemas.py +0 -0
  167. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/policy_schemas.py +0 -0
  168. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/process_execution_schemas.py +0 -0
  169. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/process_redaction.py +0 -0
  170. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/progress_bridge_schemas.py +0 -0
  171. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/progress_hook_schemas.py +0 -0
  172. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/project_profile_preset_schemas.py +0 -0
  173. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/project_profile_schemas.py +0 -0
  174. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/proof_integrity_schemas.py +0 -0
  175. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/proof_validation.py +0 -0
  176. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/quality_modes.py +0 -0
  177. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/redaction.py +0 -0
  178. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/release_contract_schemas.py +0 -0
  179. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/research_evidence_schemas.py +0 -0
  180. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/review_mesh_recommendation_schemas.py +0 -0
  181. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/review_mesh_schemas.py +0 -0
  182. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/review_quality_schemas.py +0 -0
  183. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/review_verdict.py +0 -0
  184. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/runner_schemas.py +0 -0
  185. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/runner_worktree_schemas.py +0 -0
  186. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/sandbox_schemas.py +0 -0
  187. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/schema_builders.py +0 -0
  188. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/schemas.py +0 -0
  189. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/status_goal_schemas.py +0 -0
  190. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/task_template_schemas.py +0 -0
  191. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/token_estimation.py +0 -0
  192. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/usage_export_schemas.py +0 -0
  193. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/contracts/validation.py +0 -0
  194. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0/src/agent_lifecycle/data}/profiles/project-workflow-presets/feature-implementation.v1.json +0 -0
  195. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0/src/agent_lifecycle/data}/profiles/project-workflow-presets/quick-change.v1.json +0 -0
  196. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0/src/agent_lifecycle/data}/profiles/project-workflow-presets/research-review.v1.json +0 -0
  197. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/diagnostics/__init__.py +0 -0
  198. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/diagnostics/bundles.py +0 -0
  199. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/diagnostics/installation_catalog.py +0 -0
  200. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/evidence_index/__init__.py +0 -0
  201. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/evidence_index/core.py +0 -0
  202. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/evidence_index/episode_index.py +0 -0
  203. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/evidence_index/external_context.py +0 -0
  204. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/followup/__init__.py +0 -0
  205. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/followup/records.py +0 -0
  206. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/freeze/__init__.py +0 -0
  207. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/freeze/locks.py +0 -0
  208. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/freeze/package_integrity.py +0 -0
  209. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/goal/__init__.py +0 -0
  210. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/goal/records.py +0 -0
  211. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/host_protocol/__init__.py +0 -0
  212. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/host_protocol/acp_capability.py +0 -0
  213. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/host_protocol/agent_plugin_qualification.py +0 -0
  214. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/host_protocol/capabilities.py +0 -0
  215. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/host_protocol/context_events.py +0 -0
  216. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/host_protocol/contracts.py +0 -0
  217. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/host_protocol/event_capture.py +0 -0
  218. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/host_protocol/events.py +0 -0
  219. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/host_protocol/inspection.py +0 -0
  220. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/host_protocol/inspection_claude.py +0 -0
  221. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/host_protocol/inspection_codex.py +0 -0
  222. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/host_protocol/inspection_common.py +0 -0
  223. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/host_protocol/inspection_cursor.py +0 -0
  224. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/host_protocol/inspection_gemini_cli.py +0 -0
  225. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/host_protocol/inspection_hermes.py +0 -0
  226. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/host_protocol/inspection_kimi_code.py +0 -0
  227. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/host_protocol/inspection_opencode.py +0 -0
  228. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/host_protocol/inspection_profile.py +0 -0
  229. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/host_protocol/inspection_qwen_code.py +0 -0
  230. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/host_protocol/process_port.py +0 -0
  231. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/host_protocol/receipts.py +0 -0
  232. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/host_protocol/scaffold.py +0 -0
  233. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/host_protocol/thread_bridge.py +0 -0
  234. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/host_protocol/usage_normalizers.py +0 -0
  235. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/host_protocol/validation.py +0 -0
  236. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/imports/__init__.py +0 -0
  237. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/imports/agentskills_profile.py +0 -0
  238. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/imports/bmad_profile.py +0 -0
  239. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/imports/constitution_adr.py +0 -0
  240. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/imports/dialect_profiles.py +0 -0
  241. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/imports/external_agent.py +0 -0
  242. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/imports/external_dialects.py +0 -0
  243. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/imports/external_workflow.py +0 -0
  244. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/imports/multi_markdown.py +0 -0
  245. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/imports/openspec_profile.py +0 -0
  246. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/imports/spec_kit_profile.py +0 -0
  247. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/imports/spec_kitty_profile.py +0 -0
  248. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/metrics/__init__.py +0 -0
  249. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/metrics/audit_optimization.py +0 -0
  250. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/metrics/audit_samples.py +0 -0
  251. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/metrics/costs.py +0 -0
  252. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/metrics/outcome_index.py +0 -0
  253. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/metrics/phase_resources.py +0 -0
  254. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/metrics/recommendations.py +0 -0
  255. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/metrics/regression_signals.py +0 -0
  256. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/metrics/usage_export.py +0 -0
  257. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/model_routing/__init__.py +0 -0
  258. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/model_routing/profiles.py +0 -0
  259. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/model_routing/receipts.py +0 -0
  260. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/neutrality/__init__.py +0 -0
  261. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/neutrality/__main__.py +0 -0
  262. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/neutrality/authority.py +0 -0
  263. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/neutrality/cli.py +0 -0
  264. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/neutrality/errors.py +0 -0
  265. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/neutrality/gate.py +0 -0
  266. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/neutrality/paths.py +0 -0
  267. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/neutrality/policy.py +0 -0
  268. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/neutrality/receipt.py +0 -0
  269. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/neutrality/test_runner.py +0 -0
  270. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/planning/__init__.py +0 -0
  271. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/planning/acceptance_markdown.py +0 -0
  272. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/planning/completeness.py +0 -0
  273. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/planning/continuity.py +0 -0
  274. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/planning/deltas.py +0 -0
  275. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/planning/task_compatibility.py +0 -0
  276. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/planning/templates.py +0 -0
  277. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/planning/tiering.py +0 -0
  278. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/planning/validation.py +0 -0
  279. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/policy/__init__.py +0 -0
  280. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/policy/adaptive_lifecycle.py +0 -0
  281. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/policy/apply.py +0 -0
  282. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/policy/execution_strategy.py +0 -0
  283. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/policy/proposals.py +0 -0
  284. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/policy/risk_execution.py +0 -0
  285. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/policy/runtime_receipts.py +0 -0
  286. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/policy/thread_bridge.py +0 -0
  287. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/project/__init__.py +0 -0
  288. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/project/guidance.py +0 -0
  289. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/project/merge.py +0 -0
  290. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/project/principles.py +0 -0
  291. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/project/profile.py +0 -0
  292. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/py.typed +0 -0
  293. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/quality/__init__.py +0 -0
  294. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/quality/bug_forensics.py +0 -0
  295. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/quality/bug_forensics_advisor.py +0 -0
  296. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/quality/bug_forensics_recipes.py +0 -0
  297. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/quality/cross_check.py +0 -0
  298. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/quality/failure_classification.py +0 -0
  299. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/quality/packs.py +0 -0
  300. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/reporting/__init__.py +0 -0
  301. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/reporting/change_summary.py +0 -0
  302. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/reporting/event_feed.py +0 -0
  303. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/reporting/execution_resources.py +0 -0
  304. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/reporting/progress_bridge.py +0 -0
  305. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/reporting/progress_hooks.py +0 -0
  306. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/reporting/progress_terminal.py +0 -0
  307. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/reporting/progress_view.py +0 -0
  308. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/reporting/status_view.py +0 -0
  309. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/research/__init__.py +0 -0
  310. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/research/evidence.py +0 -0
  311. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/review/__init__.py +0 -0
  312. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/review/validation.py +0 -0
  313. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/review_mesh/__init__.py +0 -0
  314. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/review_mesh/assignments.py +0 -0
  315. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/review_mesh/contracts.py +0 -0
  316. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/review_mesh/operator_templates.py +0 -0
  317. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/review_mesh/quorum.py +0 -0
  318. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/review_mesh/recommendation.py +0 -0
  319. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/review_mesh/results.py +0 -0
  320. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/review_mesh/synthesis.py +0 -0
  321. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/runner/__init__.py +0 -0
  322. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/runner/core.py +0 -0
  323. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/runner/sandbox_receipts.py +0 -0
  324. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/specification/__init__.py +0 -0
  325. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/specification/completion_gate.py +0 -0
  326. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/specification/completion_signal.py +0 -0
  327. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/specification/validation.py +0 -0
  328. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/workflow/__init__.py +0 -0
  329. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/workflow/artifacts.py +0 -0
  330. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/workflow/budget_decisions.py +0 -0
  331. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/workflow/budget_policy.py +0 -0
  332. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/workflow/budget_receipts.py +0 -0
  333. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/workflow/bug_forensics_gates.py +0 -0
  334. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/workflow/checkpoint_gate.py +0 -0
  335. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/workflow/controller.py +0 -0
  336. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/workflow/events.py +0 -0
  337. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/workflow/final_proof_integrity.py +0 -0
  338. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/workflow/finalization.py +0 -0
  339. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/workflow/gates.py +0 -0
  340. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/workflow/implementation_audit_gate.py +0 -0
  341. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/workflow/lineage.py +0 -0
  342. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/workflow/managed_runner.py +0 -0
  343. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/workflow/model_usage.py +0 -0
  344. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/workflow/next_action.py +0 -0
  345. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/workflow/operation_kernel.py +0 -0
  346. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/workflow/plan_adoption.py +0 -0
  347. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/workflow/query.py +0 -0
  348. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/workflow/review_mesh_gate.py +0 -0
  349. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/workflow/reviews.py +0 -0
  350. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/workflow/risk_execution_gate.py +0 -0
  351. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/workflow/run_transitions.py +0 -0
  352. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/workflow/sandbox_policy.py +0 -0
  353. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/workflow/selectors.py +0 -0
  354. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/workflow/state.py +0 -0
  355. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/workflow/task_transitions.py +0 -0
  356. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/worktree/__init__.py +0 -0
  357. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle/worktree/isolation.py +0 -0
  358. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle_kit.egg-info/dependency_links.txt +0 -0
  359. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle_kit.egg-info/entry_points.txt +0 -0
  360. {agent_lifecycle_kit-1.76.0 → agent_lifecycle_kit-1.78.0}/src/agent_lifecycle_kit.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent-lifecycle-kit
3
- Version: 1.76.0
3
+ Version: 1.78.0
4
4
  Summary: Provider-neutral lifecycle control layer that helps coding agents plan, execute, validate, and prove software tasks to completion.
5
5
  Author: Agent Lifecycle Kit contributors
6
6
  License: Apache-2.0
@@ -43,7 +43,7 @@ ALK provides a verifiable finish for external-agent work with proportionate cont
43
43
  ## Quick start
44
44
  Start with [install ALK and make the first run](docs/guides/install-and-first-run.md).
45
45
 
46
- It includes macOS, Linux and Windows instructions, Python 3.11-3.14, [PyPI](https://pypi.org/project/agent-lifecycle-kit/) installation with `python -m pip install agent-lifecycle-kit==1.76.0`, and common `agent-lifecycle version` errors.
46
+ It includes macOS, Linux and Windows instructions, Python 3.11-3.14, [PyPI](https://pypi.org/project/agent-lifecycle-kit/) installation with `python -m pip install agent-lifecycle-kit==1.78.0`, and common `agent-lifecycle version` errors.
47
47
 
48
48
  For a quick start, run:
49
49
 
@@ -64,7 +64,6 @@ and pass a task from a file:
64
64
  agent-lifecycle start --adapter <adapter-id> --file task.md
65
65
  ```
66
66
 
67
- - Start with [quickstart](docs/guides/quickstart.md).
68
67
  - Then choose a suitable scenario in [how ALK works for different tasks](docs/guides/how-alk-works.md).
69
68
  - The boundaries of [planning-only launch](docs/reference/planning-only-launch.md) and [frozen-task launch through a verified profile](docs/reference/qualified-host-launch.md) are documented in the reference. Shipped planning profiles remain candidates with safe failure until the corresponding profile is verified.
70
69
  - The [system architecture](docs/architecture/system-architecture.md) page explains how the project is organized, and [project comparison](docs/reference/project-comparison.md) shows how it differs from similar tools.
@@ -81,6 +80,7 @@ agent-lifecycle start --adapter <adapter-id> --file task.md
81
80
  composes risk, model class, packet size, review and resource limits.
82
81
  - Usage visibility: tokens, time, resource counters and structured execution records without sensitive data are native; monetary cost is optional and only used when a metered host reports it.
83
82
  - Project-specific workflow settings: ALK can discover and validate uncommitted local defaults, or apply a built-in workflow preset for a common route, while the frozen plan remains authoritative.
83
+ - Reproducible Python maintenance: pinned development-only Ruff, mypy and coverage checks, a non-growing quality ratchet, stable redacted CLI errors, installed package resources, an explicit documented Python API, and bounded performance controls that preserve security and evidence rules.
84
84
  - Project principles and plan deltas keep long-running work understandable: principles provide bounded defaults, while a digest-bound delta shows which plan authority changed and whether review and a new lock are required. CI also checks an acyclic module/package graph, layer direction and source-size limits; adapter inspection uses bounded literal profiles and fails closed without executing adapter code.
85
85
  - Read-only progress and managed sessions: host UIs can show lifecycle state,
86
86
  attested tokens and Git-style change counters; `start` accepts task text,
@@ -195,7 +195,7 @@ Adapter installation and support-level details live in [Adapter install](docs/ad
195
195
  - Start: [English documentation](docs/README.md), [Русская документация](docs/ru/README.md), [Install](docs/guides/install-and-first-run.md), [Quickstart](docs/guides/quickstart.md), [Beginner and advanced workflows](docs/guides/beginner-and-advanced-workflows.md), [Commands by task](docs/guides/commands-by-task.md), [Research workflow](docs/guides/research-workflow.md), [Lifecycle task scenarios](docs/guides/lifecycle-cookbook.md), and [Code review workflows](docs/guides/code-review-workflows.md).
196
196
  - Planning and adapters: [Issue to specification drafts](docs/guides/issue-to-spec.md), [Adapter install](docs/adapters/install.md), and [Adapter support matrix](docs/adapters/support-matrix.md).
197
197
  - Reference: [System architecture](docs/architecture/system-architecture.md), [workflow customization and execution controls](docs/reference/workflow-customization.md), [execution strategy](docs/reference/execution-strategy.md), [CLI reference](docs/reference/cli.md), [Research evidence](docs/reference/research-evidence.md), [Source of truth](docs/reference/source-of-truth.md), [Managed lifecycle runner](docs/reference/managed-lifecycle-runner.md), [Managed adapter sessions](docs/reference/managed-adapter-sessions.md), [Portable Agent Plugins](docs/reference/agent-plugins.md), [Plugin publication](docs/reference/plugin-publication.md), [Implementation audit](docs/reference/implementation-audit.md), [Plan completeness](docs/reference/plan-completeness.md), [Public contracts](docs/reference/public-contracts.md), and [Readiness diagnostics](docs/reference/readiness-diagnostics.md).
198
- - Quality and resources: [Reference-task evaluation](docs/reference/reference-task-evaluation.md), [model routing](docs/reference/model-routing.md), [quality-cost learning](docs/reference/quality-cost-learning.md), [lifecycle cost accounting](docs/reference/lifecycle-cost.md), [host-local token accounting](docs/reference/host-local-token-accounting.md), [process execution observability](docs/reference/process-execution-observability.md), [Usage export](docs/reference/usage-export.md), and [Evidence integrity](docs/reference/evidence-integrity.md).
198
+ - Quality and resources: [Reference-task evaluation](docs/reference/reference-task-evaluation.md), [model routing](docs/reference/model-routing.md), [quality-cost learning](docs/reference/quality-cost-learning.md), [performance and resource budgets](docs/reference/performance-and-resource-budgets.md), [lifecycle cost accounting](docs/reference/lifecycle-cost.md), [host-local token accounting](docs/reference/host-local-token-accounting.md), [process execution observability](docs/reference/process-execution-observability.md), [Usage export](docs/reference/usage-export.md), and [Evidence integrity](docs/reference/evidence-integrity.md).
199
199
  - Profiles and operations: [Project workflow presets](docs/reference/workflow-presets.md), [Project workflow profile](docs/reference/project-workflow-profile.md), [Read-only status views](docs/reference/read-only-status-view.md), [Adapter progress bridge](docs/reference/automatic-progress-bridge.md), [Sandbox boundaries](docs/reference/sandbox-boundaries.md), [Import mappers](docs/reference/import-mappers.md), [Episode retrieval](docs/reference/episode-retrieval.md), [Runner recovery](docs/reference/runner-recovery.md), [Cross-check profile](docs/reference/cross-check-profile.md), [Review Mesh](docs/reference/review-mesh.md), [Bug Forensics profile](docs/reference/bug-forensics.md), and [Bug Forensics context budget](docs/reference/bug-forensics-context-budget.md).
200
200
  - Release assets: [Task templates](templates/tasks/README.md), [Neutrality scanning](docs/reference/neutrality.md), and [Release security](docs/security/release-security.md).
201
201
 
@@ -21,7 +21,7 @@ ALK provides a verifiable finish for external-agent work with proportionate cont
21
21
  ## Quick start
22
22
  Start with [install ALK and make the first run](docs/guides/install-and-first-run.md).
23
23
 
24
- It includes macOS, Linux and Windows instructions, Python 3.11-3.14, [PyPI](https://pypi.org/project/agent-lifecycle-kit/) installation with `python -m pip install agent-lifecycle-kit==1.76.0`, and common `agent-lifecycle version` errors.
24
+ It includes macOS, Linux and Windows instructions, Python 3.11-3.14, [PyPI](https://pypi.org/project/agent-lifecycle-kit/) installation with `python -m pip install agent-lifecycle-kit==1.78.0`, and common `agent-lifecycle version` errors.
25
25
 
26
26
  For a quick start, run:
27
27
 
@@ -42,7 +42,6 @@ and pass a task from a file:
42
42
  agent-lifecycle start --adapter <adapter-id> --file task.md
43
43
  ```
44
44
 
45
- - Start with [quickstart](docs/guides/quickstart.md).
46
45
  - Then choose a suitable scenario in [how ALK works for different tasks](docs/guides/how-alk-works.md).
47
46
  - The boundaries of [planning-only launch](docs/reference/planning-only-launch.md) and [frozen-task launch through a verified profile](docs/reference/qualified-host-launch.md) are documented in the reference. Shipped planning profiles remain candidates with safe failure until the corresponding profile is verified.
48
47
  - The [system architecture](docs/architecture/system-architecture.md) page explains how the project is organized, and [project comparison](docs/reference/project-comparison.md) shows how it differs from similar tools.
@@ -59,6 +58,7 @@ agent-lifecycle start --adapter <adapter-id> --file task.md
59
58
  composes risk, model class, packet size, review and resource limits.
60
59
  - Usage visibility: tokens, time, resource counters and structured execution records without sensitive data are native; monetary cost is optional and only used when a metered host reports it.
61
60
  - Project-specific workflow settings: ALK can discover and validate uncommitted local defaults, or apply a built-in workflow preset for a common route, while the frozen plan remains authoritative.
61
+ - Reproducible Python maintenance: pinned development-only Ruff, mypy and coverage checks, a non-growing quality ratchet, stable redacted CLI errors, installed package resources, an explicit documented Python API, and bounded performance controls that preserve security and evidence rules.
62
62
  - Project principles and plan deltas keep long-running work understandable: principles provide bounded defaults, while a digest-bound delta shows which plan authority changed and whether review and a new lock are required. CI also checks an acyclic module/package graph, layer direction and source-size limits; adapter inspection uses bounded literal profiles and fails closed without executing adapter code.
63
63
  - Read-only progress and managed sessions: host UIs can show lifecycle state,
64
64
  attested tokens and Git-style change counters; `start` accepts task text,
@@ -173,7 +173,7 @@ Adapter installation and support-level details live in [Adapter install](docs/ad
173
173
  - Start: [English documentation](docs/README.md), [Русская документация](docs/ru/README.md), [Install](docs/guides/install-and-first-run.md), [Quickstart](docs/guides/quickstart.md), [Beginner and advanced workflows](docs/guides/beginner-and-advanced-workflows.md), [Commands by task](docs/guides/commands-by-task.md), [Research workflow](docs/guides/research-workflow.md), [Lifecycle task scenarios](docs/guides/lifecycle-cookbook.md), and [Code review workflows](docs/guides/code-review-workflows.md).
174
174
  - Planning and adapters: [Issue to specification drafts](docs/guides/issue-to-spec.md), [Adapter install](docs/adapters/install.md), and [Adapter support matrix](docs/adapters/support-matrix.md).
175
175
  - Reference: [System architecture](docs/architecture/system-architecture.md), [workflow customization and execution controls](docs/reference/workflow-customization.md), [execution strategy](docs/reference/execution-strategy.md), [CLI reference](docs/reference/cli.md), [Research evidence](docs/reference/research-evidence.md), [Source of truth](docs/reference/source-of-truth.md), [Managed lifecycle runner](docs/reference/managed-lifecycle-runner.md), [Managed adapter sessions](docs/reference/managed-adapter-sessions.md), [Portable Agent Plugins](docs/reference/agent-plugins.md), [Plugin publication](docs/reference/plugin-publication.md), [Implementation audit](docs/reference/implementation-audit.md), [Plan completeness](docs/reference/plan-completeness.md), [Public contracts](docs/reference/public-contracts.md), and [Readiness diagnostics](docs/reference/readiness-diagnostics.md).
176
- - Quality and resources: [Reference-task evaluation](docs/reference/reference-task-evaluation.md), [model routing](docs/reference/model-routing.md), [quality-cost learning](docs/reference/quality-cost-learning.md), [lifecycle cost accounting](docs/reference/lifecycle-cost.md), [host-local token accounting](docs/reference/host-local-token-accounting.md), [process execution observability](docs/reference/process-execution-observability.md), [Usage export](docs/reference/usage-export.md), and [Evidence integrity](docs/reference/evidence-integrity.md).
176
+ - Quality and resources: [Reference-task evaluation](docs/reference/reference-task-evaluation.md), [model routing](docs/reference/model-routing.md), [quality-cost learning](docs/reference/quality-cost-learning.md), [performance and resource budgets](docs/reference/performance-and-resource-budgets.md), [lifecycle cost accounting](docs/reference/lifecycle-cost.md), [host-local token accounting](docs/reference/host-local-token-accounting.md), [process execution observability](docs/reference/process-execution-observability.md), [Usage export](docs/reference/usage-export.md), and [Evidence integrity](docs/reference/evidence-integrity.md).
177
177
  - Profiles and operations: [Project workflow presets](docs/reference/workflow-presets.md), [Project workflow profile](docs/reference/project-workflow-profile.md), [Read-only status views](docs/reference/read-only-status-view.md), [Adapter progress bridge](docs/reference/automatic-progress-bridge.md), [Sandbox boundaries](docs/reference/sandbox-boundaries.md), [Import mappers](docs/reference/import-mappers.md), [Episode retrieval](docs/reference/episode-retrieval.md), [Runner recovery](docs/reference/runner-recovery.md), [Cross-check profile](docs/reference/cross-check-profile.md), [Review Mesh](docs/reference/review-mesh.md), [Bug Forensics profile](docs/reference/bug-forensics.md), and [Bug Forensics context budget](docs/reference/bug-forensics-context-budget.md).
178
178
  - Release assets: [Task templates](templates/tasks/README.md), [Neutrality scanning](docs/reference/neutrality.md), and [Release security](docs/security/release-security.md).
179
179
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "agent-lifecycle-kit"
7
- version = "1.76.0"
7
+ version = "1.78.0"
8
8
  description = "Provider-neutral lifecycle control layer that helps coding agents plan, execute, validate, and prove software tasks to completion."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11,<3.15"
@@ -39,6 +39,13 @@ classifiers = [
39
39
  ]
40
40
  dependencies = []
41
41
 
42
+ [dependency-groups]
43
+ quality = [
44
+ "ruff==0.16.3",
45
+ "mypy==1.17.1",
46
+ "coverage==7.10.6",
47
+ ]
48
+
42
49
  [project.scripts]
43
50
  agent-lifecycle = "agent_lifecycle.cli:main"
44
51
  agent-lifecycle-neutrality = "agent_lifecycle.neutrality.cli:main"
@@ -47,14 +54,29 @@ agent-lifecycle-neutrality = "agent_lifecycle.neutrality.cli:main"
47
54
  where = ["src"]
48
55
 
49
56
  [tool.setuptools.package-data]
50
- agent_lifecycle = ["py.typed"]
57
+ agent_lifecycle = ["py.typed", "data/profiles/**/*.json"]
58
+
59
+ [tool.ruff]
60
+ target-version = "py311"
61
+ line-length = 120
62
+ src = ["src"]
63
+
64
+ [tool.ruff.lint]
65
+ select = ["E4", "E7", "E9", "F", "B", "I", "UP", "RUF", "SIM", "PTH", "ARG", "BLE"]
66
+
67
+ [tool.ruff.lint.isort]
68
+ known-first-party = ["agent_lifecycle"]
69
+
70
+ [tool.ruff.format]
71
+ quote-style = "double"
72
+
73
+ [tool.mypy]
74
+ python_version = "3.11"
75
+ files = ["src/agent_lifecycle"]
76
+ ignore_missing_imports = true
77
+ show_error_codes = true
51
78
 
52
79
  [tool.setuptools.data-files]
53
- "profiles/project-workflow-presets" = [
54
- "profiles/project-workflow-presets/quick-change.v1.json",
55
- "profiles/project-workflow-presets/research-review.v1.json",
56
- "profiles/project-workflow-presets/feature-implementation.v1.json",
57
- ]
58
80
  "benchmarks/reference-tasks" = [
59
81
  "benchmarks/reference-tasks/README.md",
60
82
  "benchmarks/reference-tasks/manifest.json",
@@ -2,4 +2,4 @@
2
2
 
3
3
  from ._version import __version__
4
4
 
5
- __all__ = ["__version__"]
5
+ __all__ = ("__version__",)
@@ -1,3 +1,3 @@
1
1
  """Package version."""
2
2
 
3
- __version__ = "1.76.0"
3
+ __version__ = "1.78.0"
@@ -2,40 +2,28 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- import hashlib
6
- import os
7
- import subprocess
5
+ from collections.abc import Callable
8
6
  from pathlib import Path
9
- from typing import Any, Callable
7
+ from typing import Any
10
8
 
11
9
  from agent_lifecycle.adapter_sessions.contracts import (
12
10
  build_launch_receipt,
13
- build_local_launch_probe_receipt,
14
11
  build_local_launch_profile_receipt,
15
12
  )
16
13
  from agent_lifecycle.adapter_sessions.env import resolve_launch_env
17
14
  from agent_lifecycle.adapter_sessions.local_launch_profile import (
18
15
  build_executable_identity,
19
16
  load_local_launch_profile,
20
- local_receipt_argv,
21
17
  local_profile_summary,
22
- planning_receipt_argv,
23
- render_local_launch_argv,
24
18
  render_planning_launch_argv,
25
19
  )
26
20
  from agent_lifecycle.adapter_sessions.planning_launch import run_planning_launch
27
- from agent_lifecycle.adapter_sessions.process import run_process as _process_runner
28
21
  from agent_lifecycle.adapter_sessions.qualification import (
29
- build_qualification_receipt,
30
- require_planning_qualification_receipt,
31
- require_qualification_receipt,
32
22
  shipped_profile_digest,
33
- write_qualification_receipt,
34
23
  )
24
+ from agent_lifecycle.adapter_sessions.worktree_identity import capture_git_worktree_identity
35
25
  from agent_lifecycle.contracts import LifecycleError, canonical_digest, read_json_object
36
- from agent_lifecycle.freeze import verify_plan_package_integrity
37
26
  from agent_lifecycle.host_protocol.validation import validate_managed_launch_profile
38
- from agent_lifecycle.workflow.risk_execution_gate import validate_task_risk_profile
39
27
 
40
28
 
41
29
  def load_adapter_descriptor(adapter_id: str, descriptor_path: Path | None = None) -> tuple[Path, dict[str, Any]]:
@@ -69,7 +57,8 @@ def launch_from_descriptor(
69
57
  raw_profile = descriptor.get("managedLaunch")
70
58
  profile = raw_profile if isinstance(raw_profile, dict) else {}
71
59
  validation = validate_managed_launch_profile(profile)
72
- adapter_id = descriptor.get("adapterId") if isinstance(descriptor.get("adapterId"), str) else "unknown"
60
+ raw_adapter_id = descriptor.get("adapterId")
61
+ adapter_id = raw_adapter_id if isinstance(raw_adapter_id, str) else "unknown"
73
62
  timeout_seconds = _timeout_seconds(profile)
74
63
  blockers: list[dict[str, Any]] = []
75
64
  if validation["status"] != "PASS":
@@ -126,8 +115,6 @@ def inspect_local_launch_profile(
126
115
  )
127
116
 
128
117
 
129
-
130
-
131
118
  def run_planning_qualification_candidate(
132
119
  *,
133
120
  profile_path: Path,
@@ -198,7 +185,8 @@ def run_planning_qualification_candidate(
198
185
  )
199
186
  after = identity_runner(root)
200
187
  blockers = list(receipt.get("blockers", []))
201
- usage = receipt.get("usageEvidence") if isinstance(receipt.get("usageEvidence"), dict) else {}
188
+ raw_usage = receipt.get("usageEvidence")
189
+ usage: dict[str, Any] = raw_usage if isinstance(raw_usage, dict) else {}
202
190
  input_tokens = usage.get("inputTokens")
203
191
  output_tokens = usage.get("outputTokens")
204
192
  if usage.get("confidence") != "ATTESTED" or not isinstance(input_tokens, int) or not isinstance(output_tokens, int):
@@ -315,90 +303,6 @@ def _state_task(state: dict[str, Any], task_id: str) -> dict[str, Any]:
315
303
  raise LifecycleError("local-launch-task-missing", "task is not present in workflow state", {"taskId": task_id})
316
304
 
317
305
 
318
- def capture_git_worktree_identity(project_root: Path) -> dict[str, Any]:
319
- """Capture normalized authoritative Git content without requiring cleanliness."""
320
-
321
- root = project_root.resolve()
322
- head = _git_bytes(root, ["rev-parse", "HEAD"]).decode("ascii", errors="strict").strip()
323
- staged = _git_bytes(root, ["diff", "--cached", "--binary", "--no-ext-diff"])
324
- unstaged = _git_bytes(root, ["diff", "--binary", "--no-ext-diff"])
325
- submodules = _git_bytes(root, ["submodule", "status", "--recursive"])
326
- untracked_raw = _git_bytes(root, ["ls-files", "--others", "--exclude-standard", "-z"])
327
- untracked_rows: list[dict[str, Any]] = []
328
- total_bytes = 0
329
- for raw_name in sorted(item for item in untracked_raw.split(b"\0") if item):
330
- relative = os.fsdecode(raw_name)
331
- path = root / relative
332
- try:
333
- before = path.lstat()
334
- if path.is_symlink():
335
- payload = os.fsencode(os.readlink(path))
336
- kind = "symlink"
337
- else:
338
- payload = path.read_bytes()
339
- kind = "file"
340
- after = path.lstat()
341
- except OSError as exc:
342
- raise LifecycleError(
343
- "planning-worktree-read-race",
344
- "failed to capture an untracked worktree entry",
345
- {"errorType": type(exc).__name__},
346
- ) from exc
347
- if (before.st_size, before.st_mtime_ns) != (after.st_size, after.st_mtime_ns):
348
- raise LifecycleError(
349
- "planning-worktree-read-race",
350
- "untracked worktree entry changed during identity capture",
351
- )
352
- total_bytes += len(payload)
353
- untracked_rows.append(
354
- {
355
- "pathBytesSha256": hashlib.sha256(raw_name).hexdigest(),
356
- "kind": kind,
357
- "bytes": len(payload),
358
- "sha256": hashlib.sha256(payload).hexdigest(),
359
- }
360
- )
361
- body = {
362
- "schemaVersion": "agent-planning-worktree-identity.v1",
363
- "head": head,
364
- "stagedDiffSha256": hashlib.sha256(staged).hexdigest(),
365
- "unstagedDiffSha256": hashlib.sha256(unstaged).hexdigest(),
366
- "submoduleStateSha256": hashlib.sha256(submodules).hexdigest(),
367
- "untrackedTreeSha256": canonical_digest({"entries": untracked_rows}),
368
- "untrackedCount": len(untracked_rows),
369
- "untrackedBytes": total_bytes,
370
- "ignoredLocalStateExcluded": True,
371
- }
372
- return {**body, "identityDigest": canonical_digest(body)}
373
-
374
-
375
- def _git_bytes(root: Path, args: list[str]) -> bytes:
376
- try:
377
- result = subprocess.run(
378
- ["git", *args],
379
- cwd=root,
380
- shell=False,
381
- stdin=subprocess.DEVNULL,
382
- stdout=subprocess.PIPE,
383
- stderr=subprocess.PIPE,
384
- timeout=10,
385
- check=False,
386
- )
387
- except (OSError, subprocess.TimeoutExpired) as exc:
388
- raise LifecycleError(
389
- "planning-worktree-identity-failed",
390
- "Git identity capture failed closed",
391
- {"errorType": type(exc).__name__},
392
- ) from exc
393
- if result.returncode != 0:
394
- raise LifecycleError(
395
- "planning-worktree-identity-failed",
396
- "Git identity command failed closed",
397
- {"command": args[0], "exitCode": result.returncode},
398
- )
399
- return result.stdout
400
-
401
-
402
306
  def _blocked_planning_launch(
403
307
  *,
404
308
  adapter_id: str,
@@ -478,7 +382,8 @@ def _planning_qualification_report(
478
382
  and before.get("identityDigest") == after.get("identityDigest")
479
383
  and not blockers
480
384
  )
481
- policy = profile.get("qualification") if isinstance(profile.get("qualification"), dict) else {}
385
+ raw_policy = profile.get("qualification")
386
+ policy: dict[str, Any] = raw_policy if isinstance(raw_policy, dict) else {}
482
387
  body = {
483
388
  "schemaVersion": "agent-planning-launch-qualification-evidence.v1",
484
389
  "status": "PASS" if passed else "FAIL",
@@ -490,7 +395,8 @@ def _planning_qualification_report(
490
395
  "maxWallSeconds": approved_wall_seconds,
491
396
  "modelTokenBudget": approved_model_token_budget,
492
397
  },
493
- "usageEvidence": usage_evidence or {
398
+ "usageEvidence": usage_evidence
399
+ or {
494
400
  "confidence": "MISSING",
495
401
  "inputTokens": None,
496
402
  "outputTokens": None,
@@ -499,9 +405,7 @@ def _planning_qualification_report(
499
405
  "planningSupportStatus": "PLANNING_ONLY_QUALIFIED" if passed else "PLANNING_ONLY_UNSUPPORTED",
500
406
  "processCalls": 1 if receipt and receipt.get("hostLaunchStarted") else 0,
501
407
  "modelCallsStarted": bool(receipt and receipt.get("modelCallsStarted")),
502
- "worktreeUnchanged": bool(
503
- before and after and before.get("identityDigest") == after.get("identityDigest")
504
- ),
408
+ "worktreeUnchanged": bool(before and after and before.get("identityDigest") == after.get("identityDigest")),
505
409
  "planningReceiptDigest": receipt.get("receiptDigest") if receipt else None,
506
410
  "blockers": blockers,
507
411
  "productionPromotionClaimed": False,
@@ -2,9 +2,10 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ from collections.abc import Callable
5
6
  from dataclasses import dataclass
6
7
  from pathlib import Path
7
- from typing import Any, Callable
8
+ from typing import Any
8
9
 
9
10
  from agent_lifecycle.adapter_sessions.contracts import (
10
11
  build_launch_receipt,
@@ -12,11 +13,19 @@ from agent_lifecycle.adapter_sessions.contracts import (
12
13
  build_local_launch_profile_receipt,
13
14
  )
14
15
  from agent_lifecycle.adapter_sessions.env import resolve_launch_env
16
+ from agent_lifecycle.adapter_sessions.launch_execution import (
17
+ _attach_qualification_receipt,
18
+ _blocked_local_launch,
19
+ _blocked_planning_launch,
20
+ _managed_launch_blockers,
21
+ _state_task,
22
+ capture_git_worktree_identity,
23
+ )
15
24
  from agent_lifecycle.adapter_sessions.local_launch_profile import (
16
25
  build_executable_identity,
17
26
  load_local_launch_profile,
18
- local_receipt_argv,
19
27
  local_profile_summary,
28
+ local_receipt_argv,
20
29
  planning_receipt_argv,
21
30
  render_local_launch_argv,
22
31
  render_planning_launch_argv,
@@ -32,19 +41,8 @@ from agent_lifecycle.adapter_sessions.qualification import (
32
41
  )
33
42
  from agent_lifecycle.contracts import LifecycleError, canonical_digest, read_json_object
34
43
  from agent_lifecycle.freeze import verify_plan_package_integrity
35
- from agent_lifecycle.host_protocol.validation import validate_managed_launch_profile
36
44
  from agent_lifecycle.workflow.risk_execution_gate import validate_task_risk_profile
37
45
 
38
- from agent_lifecycle.adapter_sessions.launch_execution import (
39
- _attach_qualification_receipt,
40
- _blocked_local_launch,
41
- _blocked_planning_launch,
42
- _managed_launch_blockers,
43
- _planning_qualification_report,
44
- _state_task,
45
- capture_git_worktree_identity,
46
- )
47
-
48
46
 
49
47
  @dataclass(frozen=True)
50
48
  class _LaunchContext:
@@ -56,7 +54,7 @@ class _LaunchContext:
56
54
  env: dict[str, str]
57
55
  env_receipt: dict[str, Any]
58
56
  timeout_seconds: float
59
- shipped_digest: str
57
+ shipped_digest: str | None
60
58
  runner: Callable[..., dict[str, Any]]
61
59
 
62
60
 
@@ -232,7 +230,9 @@ def _planning_task(
232
230
  identity = _identity(context, strict=False)
233
231
  try:
234
232
  if identity["status"] != "PASS":
235
- raise LifecycleError("local-launch-executable-identity-unavailable", "planning launch executable identity is unavailable")
233
+ raise LifecycleError(
234
+ "local-launch-executable-identity-unavailable", "planning launch executable identity is unavailable"
235
+ )
236
236
  qualification_receipt = require_planning_qualification_receipt(
237
237
  project_root=context.root,
238
238
  profile=context.profile,
@@ -345,7 +345,9 @@ def _managed_task(
345
345
  if manifest.get("status") != "FROZEN":
346
346
  raise LifecycleError("local-launch-frozen-plan-required", "local launch requires a frozen plan")
347
347
  task = _state_task(state, task_id)
348
- validate_task_risk_profile(state, task, risk_profile, operation_id=operation_id, source_revision=source_revision)
348
+ validate_task_risk_profile(
349
+ state, task, risk_profile, operation_id=operation_id, source_revision=source_revision
350
+ )
349
351
  qualification_receipt = require_qualification_receipt(
350
352
  project_root=context.root,
351
353
  profile=context.profile,
@@ -389,7 +391,7 @@ def _run_managed_process(
389
391
  operation_id: str,
390
392
  source_revision: str,
391
393
  risk_profile: dict[str, Any],
392
- qualification_receipt: dict[str, Any],
394
+ qualification_receipt: dict[str, Any] | None,
393
395
  host_identity: dict[str, Any],
394
396
  ) -> dict[str, Any]:
395
397
  bindings = {
@@ -15,15 +15,14 @@ from agent_lifecycle.contracts import (
15
15
  from agent_lifecycle.contracts.canonical import ensure_private_directory
16
16
  from agent_lifecycle.contracts.persistence import (
17
17
  create_private_json as write_json_create_private,
18
+ )
19
+ from agent_lifecycle.contracts.persistence import (
18
20
  replace_private_json as write_json_replace_private,
19
- require_private_json as require_private_file,
20
21
  )
21
22
 
22
23
  PLANNING_SESSION_SCHEMA = "agent-planning-session-state.v1"
23
24
  PLANNING_SESSION_ROOT = Path(".alk/planning-sessions")
24
- PLANNING_SESSION_STATES = frozenset(
25
- {"INTAKE_ACCEPTED", "PLANNING_RUNNING", "REVIEW_REQUIRED", "BLOCKED"}
26
- )
25
+ PLANNING_SESSION_STATES = frozenset({"INTAKE_ACCEPTED", "PLANNING_RUNNING", "REVIEW_REQUIRED", "BLOCKED"})
27
26
  MAX_PLANNING_SESSION_BYTES = 65_536
28
27
  _SESSION_ID = re.compile(r"^[a-f0-9]{32}$")
29
28
  _TRANSITIONS = {
@@ -194,7 +193,9 @@ def _validate_state(
194
193
  if state.get("state") not in PLANNING_SESSION_STATES:
195
194
  raise LifecycleError("planning-session-state-invalid", "planning session state is invalid")
196
195
  if state.get("implementationAuthorized") is not False or state.get("rawTaskTextStored") is not False:
197
- raise LifecycleError("planning-session-authority-invalid", "planning session cannot carry implementation authority")
196
+ raise LifecycleError(
197
+ "planning-session-authority-invalid", "planning session cannot carry implementation authority"
198
+ )
198
199
  if state.get("productionPromotionClaimed") is not False:
199
200
  raise LifecycleError("planning-session-production-claim", "planning session cannot claim production promotion")
200
201
  body = {key: value for key, value in state.items() if key != "stateDigest"}
@@ -5,7 +5,7 @@ from __future__ import annotations
5
5
  import os
6
6
  import signal
7
7
  import subprocess
8
- import time
8
+ from contextlib import suppress
9
9
  from pathlib import Path
10
10
  from typing import Any
11
11
 
@@ -39,16 +39,12 @@ class ProcessGroupOwner:
39
39
  escalation = "none"
40
40
  if self.process.poll() is None:
41
41
  if os.name == "posix":
42
- try:
42
+ with suppress(ProcessLookupError):
43
43
  os.killpg(self.pid, signal.SIGTERM)
44
- except ProcessLookupError:
45
- pass
46
44
  if not _wait_process(self.process, grace_seconds):
47
45
  escalation = "SIGKILL"
48
- try:
46
+ with suppress(ProcessLookupError):
49
47
  os.killpg(self.pid, signal.SIGKILL)
50
- except ProcessLookupError:
51
- pass
52
48
  _wait_process(self.process, grace_seconds)
53
49
  elif self._job_handle is not None:
54
50
  _terminate_windows_job(self._job_handle)
@@ -132,7 +128,10 @@ def _create_windows_job(process: subprocess.Popen[Any]) -> int | None:
132
128
  import ctypes
133
129
  from ctypes import wintypes
134
130
 
135
- kernel32 = ctypes.WinDLL("kernel32", use_last_error=True)
131
+ win_dll = getattr(ctypes, "WinDLL", None)
132
+ if not callable(win_dll):
133
+ return None
134
+ kernel32 = win_dll("kernel32", use_last_error=True)
136
135
  kernel32.CreateJobObjectW.argtypes = [wintypes.LPVOID, wintypes.LPCWSTR]
137
136
  kernel32.CreateJobObjectW.restype = wintypes.HANDLE
138
137
  kernel32.SetInformationJobObject.argtypes = [wintypes.HANDLE, wintypes.INT, ctypes.c_void_p, wintypes.DWORD]
@@ -146,20 +145,45 @@ def _create_windows_job(process: subprocess.Popen[Any]) -> int | None:
146
145
  return None
147
146
 
148
147
  class IO_COUNTERS(ctypes.Structure):
149
- _fields_ = [("ReadOperationCount", ctypes.c_uint64), ("WriteOperationCount", ctypes.c_uint64), ("OtherOperationCount", ctypes.c_uint64), ("ReadTransferCount", ctypes.c_uint64), ("WriteTransferCount", ctypes.c_uint64), ("OtherTransferCount", ctypes.c_uint64)]
148
+ _fields_ = [
149
+ ("ReadOperationCount", ctypes.c_uint64),
150
+ ("WriteOperationCount", ctypes.c_uint64),
151
+ ("OtherOperationCount", ctypes.c_uint64),
152
+ ("ReadTransferCount", ctypes.c_uint64),
153
+ ("WriteTransferCount", ctypes.c_uint64),
154
+ ("OtherTransferCount", ctypes.c_uint64),
155
+ ]
150
156
 
151
157
  class BASIC_LIMITS(ctypes.Structure):
152
- _fields_ = [("PerProcessUserTimeLimit", ctypes.c_int64), ("PerJobUserTimeLimit", ctypes.c_int64), ("LimitFlags", wintypes.DWORD), ("MinimumWorkingSetSize", ctypes.c_size_t), ("MaximumWorkingSetSize", ctypes.c_size_t), ("ActiveProcessLimit", wintypes.DWORD), ("Affinity", ctypes.c_size_t), ("PriorityClass", wintypes.DWORD), ("SchedulingClass", wintypes.DWORD)]
158
+ _fields_ = [
159
+ ("PerProcessUserTimeLimit", ctypes.c_int64),
160
+ ("PerJobUserTimeLimit", ctypes.c_int64),
161
+ ("LimitFlags", wintypes.DWORD),
162
+ ("MinimumWorkingSetSize", ctypes.c_size_t),
163
+ ("MaximumWorkingSetSize", ctypes.c_size_t),
164
+ ("ActiveProcessLimit", wintypes.DWORD),
165
+ ("Affinity", ctypes.c_size_t),
166
+ ("PriorityClass", wintypes.DWORD),
167
+ ("SchedulingClass", wintypes.DWORD),
168
+ ]
153
169
 
154
170
  class EXTENDED_LIMITS(ctypes.Structure):
155
- _fields_ = [("BasicLimitInformation", BASIC_LIMITS), ("IoInfo", IO_COUNTERS), ("ProcessMemoryLimit", ctypes.c_size_t), ("JobMemoryLimit", ctypes.c_size_t), ("PeakProcessMemoryUsed", ctypes.c_size_t), ("PeakJobMemoryUsed", ctypes.c_size_t)]
171
+ _fields_ = [
172
+ ("BasicLimitInformation", BASIC_LIMITS),
173
+ ("IoInfo", IO_COUNTERS),
174
+ ("ProcessMemoryLimit", ctypes.c_size_t),
175
+ ("JobMemoryLimit", ctypes.c_size_t),
176
+ ("PeakProcessMemoryUsed", ctypes.c_size_t),
177
+ ("PeakJobMemoryUsed", ctypes.c_size_t),
178
+ ]
156
179
 
157
180
  limits = EXTENDED_LIMITS()
158
181
  limits.BasicLimitInformation.LimitFlags = 0x2000 # JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE
159
182
  if not kernel32.SetInformationJobObject(handle, 9, ctypes.byref(limits), ctypes.sizeof(limits)):
160
183
  kernel32.CloseHandle(handle)
161
184
  return None
162
- process_handle_value = getattr(process._handle, "value", process._handle)
185
+ process_handle = getattr(process, "_handle", None)
186
+ process_handle_value = getattr(process_handle, "value", process_handle)
163
187
  if not process_handle_value:
164
188
  kernel32.CloseHandle(handle)
165
189
  return None
@@ -177,7 +201,10 @@ def _terminate_windows_job(handle: int) -> None:
177
201
  import ctypes
178
202
  from ctypes import wintypes
179
203
 
180
- kernel32 = ctypes.WinDLL("kernel32", use_last_error=True)
204
+ win_dll = getattr(ctypes, "WinDLL", None)
205
+ if not callable(win_dll):
206
+ return
207
+ kernel32 = win_dll("kernel32", use_last_error=True)
181
208
  kernel32.TerminateJobObject.argtypes = [wintypes.HANDLE, wintypes.UINT]
182
209
  kernel32.TerminateJobObject.restype = wintypes.BOOL
183
210
  kernel32.TerminateJobObject(handle, 1)
@@ -193,11 +220,29 @@ def _windows_job_active_processes(handle: int) -> int | None:
193
220
  from ctypes import wintypes
194
221
 
195
222
  class ACCOUNTING(ctypes.Structure):
196
- _fields_ = [("TotalUserTime", ctypes.c_int64), ("TotalKernelTime", ctypes.c_int64), ("ThisPeriodTotalUserTime", ctypes.c_int64), ("ThisPeriodTotalKernelTime", ctypes.c_int64), ("TotalPageFaultCount", wintypes.DWORD), ("TotalProcesses", wintypes.DWORD), ("ActiveProcesses", wintypes.DWORD), ("TotalTerminatedProcesses", wintypes.DWORD)]
223
+ _fields_ = [
224
+ ("TotalUserTime", ctypes.c_int64),
225
+ ("TotalKernelTime", ctypes.c_int64),
226
+ ("ThisPeriodTotalUserTime", ctypes.c_int64),
227
+ ("ThisPeriodTotalKernelTime", ctypes.c_int64),
228
+ ("TotalPageFaultCount", wintypes.DWORD),
229
+ ("TotalProcesses", wintypes.DWORD),
230
+ ("ActiveProcesses", wintypes.DWORD),
231
+ ("TotalTerminatedProcesses", wintypes.DWORD),
232
+ ]
197
233
 
198
234
  info = ACCOUNTING()
199
- kernel32 = ctypes.WinDLL("kernel32", use_last_error=True)
200
- kernel32.QueryInformationJobObject.argtypes = [wintypes.HANDLE, wintypes.INT, ctypes.c_void_p, wintypes.DWORD, ctypes.POINTER(wintypes.DWORD)]
235
+ win_dll = getattr(ctypes, "WinDLL", None)
236
+ if not callable(win_dll):
237
+ return None
238
+ kernel32 = win_dll("kernel32", use_last_error=True)
239
+ kernel32.QueryInformationJobObject.argtypes = [
240
+ wintypes.HANDLE,
241
+ wintypes.INT,
242
+ ctypes.c_void_p,
243
+ wintypes.DWORD,
244
+ ctypes.POINTER(wintypes.DWORD),
245
+ ]
201
246
  kernel32.QueryInformationJobObject.restype = wintypes.BOOL
202
247
  if not kernel32.QueryInformationJobObject(handle, 1, ctypes.byref(info), ctypes.sizeof(info), None):
203
248
  return None
@@ -211,7 +256,10 @@ def _close_windows_handle(handle: int) -> None:
211
256
  import ctypes
212
257
  from ctypes import wintypes
213
258
 
214
- kernel32 = ctypes.WinDLL("kernel32", use_last_error=True)
259
+ win_dll = getattr(ctypes, "WinDLL", None)
260
+ if not callable(win_dll):
261
+ return
262
+ kernel32 = win_dll("kernel32", use_last_error=True)
215
263
  kernel32.CloseHandle.argtypes = [wintypes.HANDLE]
216
264
  kernel32.CloseHandle.restype = wintypes.BOOL
217
265
  kernel32.CloseHandle(handle)