platformforge 0.2.1__tar.gz → 0.2.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1365) hide show
  1. {platformforge-0.2.1 → platformforge-0.2.2}/CHANGELOG.md +14 -0
  2. {platformforge-0.2.1 → platformforge-0.2.2}/PKG-INFO +1 -1
  3. {platformforge-0.2.1 → platformforge-0.2.2}/docs/audits/FORGE_CONTEXT_FINAL_HOMOLOGATION.md +13 -0
  4. {platformforge-0.2.1 → platformforge-0.2.2}/docs/economy-parity/VALIDATION-RECEIPT.json +16 -16
  5. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/__init__.py +1 -1
  6. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/_forgecontext.py +109 -37
  7. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/_installkit.py +82 -14
  8. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/install/service.py +8 -2
  9. {platformforge-0.2.1 → platformforge-0.2.2}/pyproject.toml +1 -1
  10. {platformforge-0.2.1 → platformforge-0.2.2}/scripts/forge_installkit.py +82 -14
  11. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_contracts.py +1 -1
  12. {platformforge-0.2.1 → platformforge-0.2.2}/uv.lock +1 -1
  13. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/agents/pf-extractor.md +0 -0
  14. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/agents/pf-graph-builder.md +0 -0
  15. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/agents/pf-inventory.md +0 -0
  16. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/agents/pf-judge.md +0 -0
  17. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/agents/pf-reconciler.md +0 -0
  18. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/agents/pf-simulator.md +0 -0
  19. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/agents/pf-synthesizer.md +0 -0
  20. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/agents/pf-verifier.md +0 -0
  21. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/agents/platform-adversarial-critic.md +0 -0
  22. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/agents/platform-ai-infra-specialist.md +0 -0
  23. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/agents/platform-architecture-reviewer.md +0 -0
  24. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/agents/platform-aws-specialist.md +0 -0
  25. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/agents/platform-capacity-specialist.md +0 -0
  26. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/agents/platform-change-coordinator.md +0 -0
  27. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/agents/platform-crossplane-specialist.md +0 -0
  28. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/agents/platform-debate-referee.md +0 -0
  29. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/agents/platform-economy-reviewer.md +0 -0
  30. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/agents/platform-evidence-reviewer.md +0 -0
  31. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/agents/platform-federation-specialist.md +0 -0
  32. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/agents/platform-finops-specialist.md +0 -0
  33. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/agents/platform-fleet-coordinator.md +0 -0
  34. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/agents/platform-fleet-specialist.md +0 -0
  35. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/agents/platform-gitops-specialist.md +0 -0
  36. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/agents/platform-graph-specialist.md +0 -0
  37. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/agents/platform-iac-specialist.md +0 -0
  38. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/agents/platform-incident-coordinator.md +0 -0
  39. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/agents/platform-kubernetes-specialist.md +0 -0
  40. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/agents/platform-operations-safety-reviewer.md +0 -0
  41. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/agents/platform-optimization-coordinator.md +0 -0
  42. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/agents/platform-orchestrator.md +0 -0
  43. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/agents/platform-planner.md +0 -0
  44. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/agents/platform-policy-specialist.md +0 -0
  45. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/agents/platform-privacy-reviewer.md +0 -0
  46. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/agents/platform-product-coordinator.md +0 -0
  47. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/agents/platform-product-specialist.md +0 -0
  48. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/agents/platform-release-guardian.md +0 -0
  49. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/agents/platform-security-reviewer.md +0 -0
  50. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/agents/platform-security-specialist.md +0 -0
  51. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/agents/platform-sre-specialist.md +0 -0
  52. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/agents/platform-task-spec-reviewer.md +0 -0
  53. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/agents/platform-verifier.md +0 -0
  54. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/skills/platformforge-agents/SKILL.md +0 -0
  55. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/skills/platformforge-change/SKILL.md +0 -0
  56. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/skills/platformforge-core/SKILL.md +0 -0
  57. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/skills/platformforge-economy/SKILL.md +0 -0
  58. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/skills/platformforge-finops/SKILL.md +0 -0
  59. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/skills/platformforge-fleet/SKILL.md +0 -0
  60. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/skills/platformforge-governance/SKILL.md +0 -0
  61. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/skills/platformforge-graph/SKILL.md +0 -0
  62. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/skills/platformforge-lab/SKILL.md +0 -0
  63. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/skills/platformforge-sdd/SKILL.md +0 -0
  64. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/skills/platformforge-security/SKILL.md +0 -0
  65. {platformforge-0.2.1 → platformforge-0.2.2}/.agents/skills/platformforge-sre/SKILL.md +0 -0
  66. {platformforge-0.2.1 → platformforge-0.2.2}/.claude/agents/pf-extractor.md +0 -0
  67. {platformforge-0.2.1 → platformforge-0.2.2}/.claude/agents/pf-graph-builder.md +0 -0
  68. {platformforge-0.2.1 → platformforge-0.2.2}/.claude/agents/pf-inventory.md +0 -0
  69. {platformforge-0.2.1 → platformforge-0.2.2}/.claude/agents/pf-judge.md +0 -0
  70. {platformforge-0.2.1 → platformforge-0.2.2}/.claude/agents/pf-reconciler.md +0 -0
  71. {platformforge-0.2.1 → platformforge-0.2.2}/.claude/agents/pf-simulator.md +0 -0
  72. {platformforge-0.2.1 → platformforge-0.2.2}/.claude/agents/pf-synthesizer.md +0 -0
  73. {platformforge-0.2.1 → platformforge-0.2.2}/.claude/agents/pf-verifier.md +0 -0
  74. {platformforge-0.2.1 → platformforge-0.2.2}/.claude/agents/platform-adversarial-critic.md +0 -0
  75. {platformforge-0.2.1 → platformforge-0.2.2}/.claude/agents/platform-ai-infra-specialist.md +0 -0
  76. {platformforge-0.2.1 → platformforge-0.2.2}/.claude/agents/platform-architecture-reviewer.md +0 -0
  77. {platformforge-0.2.1 → platformforge-0.2.2}/.claude/agents/platform-aws-specialist.md +0 -0
  78. {platformforge-0.2.1 → platformforge-0.2.2}/.claude/agents/platform-capacity-specialist.md +0 -0
  79. {platformforge-0.2.1 → platformforge-0.2.2}/.claude/agents/platform-change-coordinator.md +0 -0
  80. {platformforge-0.2.1 → platformforge-0.2.2}/.claude/agents/platform-crossplane-specialist.md +0 -0
  81. {platformforge-0.2.1 → platformforge-0.2.2}/.claude/agents/platform-debate-referee.md +0 -0
  82. {platformforge-0.2.1 → platformforge-0.2.2}/.claude/agents/platform-economy-reviewer.md +0 -0
  83. {platformforge-0.2.1 → platformforge-0.2.2}/.claude/agents/platform-evidence-reviewer.md +0 -0
  84. {platformforge-0.2.1 → platformforge-0.2.2}/.claude/agents/platform-federation-specialist.md +0 -0
  85. {platformforge-0.2.1 → platformforge-0.2.2}/.claude/agents/platform-finops-specialist.md +0 -0
  86. {platformforge-0.2.1 → platformforge-0.2.2}/.claude/agents/platform-fleet-coordinator.md +0 -0
  87. {platformforge-0.2.1 → platformforge-0.2.2}/.claude/agents/platform-fleet-specialist.md +0 -0
  88. {platformforge-0.2.1 → platformforge-0.2.2}/.claude/agents/platform-gitops-specialist.md +0 -0
  89. {platformforge-0.2.1 → platformforge-0.2.2}/.claude/agents/platform-graph-specialist.md +0 -0
  90. {platformforge-0.2.1 → platformforge-0.2.2}/.claude/agents/platform-iac-specialist.md +0 -0
  91. {platformforge-0.2.1 → platformforge-0.2.2}/.claude/agents/platform-incident-coordinator.md +0 -0
  92. {platformforge-0.2.1 → platformforge-0.2.2}/.claude/agents/platform-kubernetes-specialist.md +0 -0
  93. {platformforge-0.2.1 → platformforge-0.2.2}/.claude/agents/platform-operations-safety-reviewer.md +0 -0
  94. {platformforge-0.2.1 → platformforge-0.2.2}/.claude/agents/platform-optimization-coordinator.md +0 -0
  95. {platformforge-0.2.1 → platformforge-0.2.2}/.claude/agents/platform-orchestrator.md +0 -0
  96. {platformforge-0.2.1 → platformforge-0.2.2}/.claude/agents/platform-planner.md +0 -0
  97. {platformforge-0.2.1 → platformforge-0.2.2}/.claude/agents/platform-policy-specialist.md +0 -0
  98. {platformforge-0.2.1 → platformforge-0.2.2}/.claude/agents/platform-privacy-reviewer.md +0 -0
  99. {platformforge-0.2.1 → platformforge-0.2.2}/.claude/agents/platform-product-coordinator.md +0 -0
  100. {platformforge-0.2.1 → platformforge-0.2.2}/.claude/agents/platform-product-specialist.md +0 -0
  101. {platformforge-0.2.1 → platformforge-0.2.2}/.claude/agents/platform-release-guardian.md +0 -0
  102. {platformforge-0.2.1 → platformforge-0.2.2}/.claude/agents/platform-security-reviewer.md +0 -0
  103. {platformforge-0.2.1 → platformforge-0.2.2}/.claude/agents/platform-security-specialist.md +0 -0
  104. {platformforge-0.2.1 → platformforge-0.2.2}/.claude/agents/platform-sre-specialist.md +0 -0
  105. {platformforge-0.2.1 → platformforge-0.2.2}/.claude/agents/platform-task-spec-reviewer.md +0 -0
  106. {platformforge-0.2.1 → platformforge-0.2.2}/.claude/agents/platform-verifier.md +0 -0
  107. {platformforge-0.2.1 → platformforge-0.2.2}/.codex/agents/pf-extractor.toml +0 -0
  108. {platformforge-0.2.1 → platformforge-0.2.2}/.codex/agents/pf-graph-builder.toml +0 -0
  109. {platformforge-0.2.1 → platformforge-0.2.2}/.codex/agents/pf-inventory.toml +0 -0
  110. {platformforge-0.2.1 → platformforge-0.2.2}/.codex/agents/pf-judge.toml +0 -0
  111. {platformforge-0.2.1 → platformforge-0.2.2}/.codex/agents/pf-reconciler.toml +0 -0
  112. {platformforge-0.2.1 → platformforge-0.2.2}/.codex/agents/pf-simulator.toml +0 -0
  113. {platformforge-0.2.1 → platformforge-0.2.2}/.codex/agents/pf-synthesizer.toml +0 -0
  114. {platformforge-0.2.1 → platformforge-0.2.2}/.codex/agents/pf-verifier.toml +0 -0
  115. {platformforge-0.2.1 → platformforge-0.2.2}/.codex/agents/platform-adversarial-critic.toml +0 -0
  116. {platformforge-0.2.1 → platformforge-0.2.2}/.codex/agents/platform-ai-infra-specialist.toml +0 -0
  117. {platformforge-0.2.1 → platformforge-0.2.2}/.codex/agents/platform-architecture-reviewer.toml +0 -0
  118. {platformforge-0.2.1 → platformforge-0.2.2}/.codex/agents/platform-aws-specialist.toml +0 -0
  119. {platformforge-0.2.1 → platformforge-0.2.2}/.codex/agents/platform-capacity-specialist.toml +0 -0
  120. {platformforge-0.2.1 → platformforge-0.2.2}/.codex/agents/platform-change-coordinator.toml +0 -0
  121. {platformforge-0.2.1 → platformforge-0.2.2}/.codex/agents/platform-crossplane-specialist.toml +0 -0
  122. {platformforge-0.2.1 → platformforge-0.2.2}/.codex/agents/platform-debate-referee.toml +0 -0
  123. {platformforge-0.2.1 → platformforge-0.2.2}/.codex/agents/platform-economy-reviewer.toml +0 -0
  124. {platformforge-0.2.1 → platformforge-0.2.2}/.codex/agents/platform-evidence-reviewer.toml +0 -0
  125. {platformforge-0.2.1 → platformforge-0.2.2}/.codex/agents/platform-federation-specialist.toml +0 -0
  126. {platformforge-0.2.1 → platformforge-0.2.2}/.codex/agents/platform-finops-specialist.toml +0 -0
  127. {platformforge-0.2.1 → platformforge-0.2.2}/.codex/agents/platform-fleet-coordinator.toml +0 -0
  128. {platformforge-0.2.1 → platformforge-0.2.2}/.codex/agents/platform-fleet-specialist.toml +0 -0
  129. {platformforge-0.2.1 → platformforge-0.2.2}/.codex/agents/platform-gitops-specialist.toml +0 -0
  130. {platformforge-0.2.1 → platformforge-0.2.2}/.codex/agents/platform-graph-specialist.toml +0 -0
  131. {platformforge-0.2.1 → platformforge-0.2.2}/.codex/agents/platform-iac-specialist.toml +0 -0
  132. {platformforge-0.2.1 → platformforge-0.2.2}/.codex/agents/platform-incident-coordinator.toml +0 -0
  133. {platformforge-0.2.1 → platformforge-0.2.2}/.codex/agents/platform-kubernetes-specialist.toml +0 -0
  134. {platformforge-0.2.1 → platformforge-0.2.2}/.codex/agents/platform-operations-safety-reviewer.toml +0 -0
  135. {platformforge-0.2.1 → platformforge-0.2.2}/.codex/agents/platform-optimization-coordinator.toml +0 -0
  136. {platformforge-0.2.1 → platformforge-0.2.2}/.codex/agents/platform-orchestrator.toml +0 -0
  137. {platformforge-0.2.1 → platformforge-0.2.2}/.codex/agents/platform-planner.toml +0 -0
  138. {platformforge-0.2.1 → platformforge-0.2.2}/.codex/agents/platform-policy-specialist.toml +0 -0
  139. {platformforge-0.2.1 → platformforge-0.2.2}/.codex/agents/platform-privacy-reviewer.toml +0 -0
  140. {platformforge-0.2.1 → platformforge-0.2.2}/.codex/agents/platform-product-coordinator.toml +0 -0
  141. {platformforge-0.2.1 → platformforge-0.2.2}/.codex/agents/platform-product-specialist.toml +0 -0
  142. {platformforge-0.2.1 → platformforge-0.2.2}/.codex/agents/platform-release-guardian.toml +0 -0
  143. {platformforge-0.2.1 → platformforge-0.2.2}/.codex/agents/platform-security-reviewer.toml +0 -0
  144. {platformforge-0.2.1 → platformforge-0.2.2}/.codex/agents/platform-security-specialist.toml +0 -0
  145. {platformforge-0.2.1 → platformforge-0.2.2}/.codex/agents/platform-sre-specialist.toml +0 -0
  146. {platformforge-0.2.1 → platformforge-0.2.2}/.codex/agents/platform-task-spec-reviewer.toml +0 -0
  147. {platformforge-0.2.1 → platformforge-0.2.2}/.codex/agents/platform-verifier.toml +0 -0
  148. {platformforge-0.2.1 → platformforge-0.2.2}/.devin/agents/pf-extractor.md +0 -0
  149. {platformforge-0.2.1 → platformforge-0.2.2}/.devin/agents/pf-graph-builder.md +0 -0
  150. {platformforge-0.2.1 → platformforge-0.2.2}/.devin/agents/pf-inventory.md +0 -0
  151. {platformforge-0.2.1 → platformforge-0.2.2}/.devin/agents/pf-judge.md +0 -0
  152. {platformforge-0.2.1 → platformforge-0.2.2}/.devin/agents/pf-reconciler.md +0 -0
  153. {platformforge-0.2.1 → platformforge-0.2.2}/.devin/agents/pf-simulator.md +0 -0
  154. {platformforge-0.2.1 → platformforge-0.2.2}/.devin/agents/pf-synthesizer.md +0 -0
  155. {platformforge-0.2.1 → platformforge-0.2.2}/.devin/agents/pf-verifier.md +0 -0
  156. {platformforge-0.2.1 → platformforge-0.2.2}/.devin/agents/platform-adversarial-critic.md +0 -0
  157. {platformforge-0.2.1 → platformforge-0.2.2}/.devin/agents/platform-ai-infra-specialist.md +0 -0
  158. {platformforge-0.2.1 → platformforge-0.2.2}/.devin/agents/platform-architecture-reviewer.md +0 -0
  159. {platformforge-0.2.1 → platformforge-0.2.2}/.devin/agents/platform-aws-specialist.md +0 -0
  160. {platformforge-0.2.1 → platformforge-0.2.2}/.devin/agents/platform-capacity-specialist.md +0 -0
  161. {platformforge-0.2.1 → platformforge-0.2.2}/.devin/agents/platform-change-coordinator.md +0 -0
  162. {platformforge-0.2.1 → platformforge-0.2.2}/.devin/agents/platform-crossplane-specialist.md +0 -0
  163. {platformforge-0.2.1 → platformforge-0.2.2}/.devin/agents/platform-debate-referee.md +0 -0
  164. {platformforge-0.2.1 → platformforge-0.2.2}/.devin/agents/platform-economy-reviewer.md +0 -0
  165. {platformforge-0.2.1 → platformforge-0.2.2}/.devin/agents/platform-evidence-reviewer.md +0 -0
  166. {platformforge-0.2.1 → platformforge-0.2.2}/.devin/agents/platform-federation-specialist.md +0 -0
  167. {platformforge-0.2.1 → platformforge-0.2.2}/.devin/agents/platform-finops-specialist.md +0 -0
  168. {platformforge-0.2.1 → platformforge-0.2.2}/.devin/agents/platform-fleet-coordinator.md +0 -0
  169. {platformforge-0.2.1 → platformforge-0.2.2}/.devin/agents/platform-fleet-specialist.md +0 -0
  170. {platformforge-0.2.1 → platformforge-0.2.2}/.devin/agents/platform-gitops-specialist.md +0 -0
  171. {platformforge-0.2.1 → platformforge-0.2.2}/.devin/agents/platform-graph-specialist.md +0 -0
  172. {platformforge-0.2.1 → platformforge-0.2.2}/.devin/agents/platform-iac-specialist.md +0 -0
  173. {platformforge-0.2.1 → platformforge-0.2.2}/.devin/agents/platform-incident-coordinator.md +0 -0
  174. {platformforge-0.2.1 → platformforge-0.2.2}/.devin/agents/platform-kubernetes-specialist.md +0 -0
  175. {platformforge-0.2.1 → platformforge-0.2.2}/.devin/agents/platform-operations-safety-reviewer.md +0 -0
  176. {platformforge-0.2.1 → platformforge-0.2.2}/.devin/agents/platform-optimization-coordinator.md +0 -0
  177. {platformforge-0.2.1 → platformforge-0.2.2}/.devin/agents/platform-orchestrator.md +0 -0
  178. {platformforge-0.2.1 → platformforge-0.2.2}/.devin/agents/platform-planner.md +0 -0
  179. {platformforge-0.2.1 → platformforge-0.2.2}/.devin/agents/platform-policy-specialist.md +0 -0
  180. {platformforge-0.2.1 → platformforge-0.2.2}/.devin/agents/platform-privacy-reviewer.md +0 -0
  181. {platformforge-0.2.1 → platformforge-0.2.2}/.devin/agents/platform-product-coordinator.md +0 -0
  182. {platformforge-0.2.1 → platformforge-0.2.2}/.devin/agents/platform-product-specialist.md +0 -0
  183. {platformforge-0.2.1 → platformforge-0.2.2}/.devin/agents/platform-release-guardian.md +0 -0
  184. {platformforge-0.2.1 → platformforge-0.2.2}/.devin/agents/platform-security-reviewer.md +0 -0
  185. {platformforge-0.2.1 → platformforge-0.2.2}/.devin/agents/platform-security-specialist.md +0 -0
  186. {platformforge-0.2.1 → platformforge-0.2.2}/.devin/agents/platform-sre-specialist.md +0 -0
  187. {platformforge-0.2.1 → platformforge-0.2.2}/.devin/agents/platform-task-spec-reviewer.md +0 -0
  188. {platformforge-0.2.1 → platformforge-0.2.2}/.devin/agents/platform-verifier.md +0 -0
  189. {platformforge-0.2.1 → platformforge-0.2.2}/.github/CODEOWNERS +0 -0
  190. {platformforge-0.2.1 → platformforge-0.2.2}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  191. {platformforge-0.2.1 → platformforge-0.2.2}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  192. {platformforge-0.2.1 → platformforge-0.2.2}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  193. {platformforge-0.2.1 → platformforge-0.2.2}/.github/workflows/ci.yml +0 -0
  194. {platformforge-0.2.1 → platformforge-0.2.2}/.github/workflows/publish-pypi.yml +0 -0
  195. {platformforge-0.2.1 → platformforge-0.2.2}/.gitignore +0 -0
  196. {platformforge-0.2.1 → platformforge-0.2.2}/.platformforge/cases/golden/argo-bad-rollout/case.yaml +0 -0
  197. {platformforge-0.2.1 → platformforge-0.2.2}/.platformforge/cases/golden/aws-dump/case.yaml +0 -0
  198. {platformforge-0.2.1 → platformforge-0.2.2}/.platformforge/cases/golden/container-unsigned/case.yaml +0 -0
  199. {platformforge-0.2.1 → platformforge-0.2.2}/.platformforge/cases/golden/gitops-drift/case.yaml +0 -0
  200. {platformforge-0.2.1 → platformforge-0.2.2}/.platformforge/cases/golden/k8s-bad-readiness/case.yaml +0 -0
  201. {platformforge-0.2.1 → platformforge-0.2.2}/.platformforge/cases/golden/k8s-single-replica/case.yaml +0 -0
  202. {platformforge-0.2.1 → platformforge-0.2.2}/.platformforge/cases/golden/network-policy-missing/case.yaml +0 -0
  203. {platformforge-0.2.1 → platformforge-0.2.2}/.platformforge/cases/golden/secret-exposure/case.yaml +0 -0
  204. {platformforge-0.2.1 → platformforge-0.2.2}/.platformforge/cases/golden/slo-burn/case.yaml +0 -0
  205. {platformforge-0.2.1 → platformforge-0.2.2}/.platformforge/cases/golden/terraform-public-bucket/case.yaml +0 -0
  206. {platformforge-0.2.1 → platformforge-0.2.2}/.platformforge/cases/holdout/cost-idle-workload/case.yaml +0 -0
  207. {platformforge-0.2.1 → platformforge-0.2.2}/.platformforge/cases/holdout/crossplane-platform/case.yaml +0 -0
  208. {platformforge-0.2.1 → platformforge-0.2.2}/.platformforge/cases/holdout/demo-platform/case.yaml +0 -0
  209. {platformforge-0.2.1 → platformforge-0.2.2}/.platformforge/cases/holdout/k8s-missing-limits/case.yaml +0 -0
  210. {platformforge-0.2.1 → platformforge-0.2.2}/.platformforge/cases/holdout/secret-prose-mixed/case.yaml +0 -0
  211. {platformforge-0.2.1 → platformforge-0.2.2}/.platformforge/cases/holdout/terraform-iam-wildcard/case.yaml +0 -0
  212. {platformforge-0.2.1 → platformforge-0.2.2}/.platformforge/ledgers/false-negatives.yaml +0 -0
  213. {platformforge-0.2.1 → platformforge-0.2.2}/.platformforge/ledgers/false-positives.yaml +0 -0
  214. {platformforge-0.2.1 → platformforge-0.2.2}/AGENTIC-OS.md +0 -0
  215. {platformforge-0.2.1 → platformforge-0.2.2}/AGENTS.md +0 -0
  216. {platformforge-0.2.1 → platformforge-0.2.2}/AI-PLATFORM.md +0 -0
  217. {platformforge-0.2.1 → platformforge-0.2.2}/APPROVALS.md +0 -0
  218. {platformforge-0.2.1 → platformforge-0.2.2}/ARCHITECTURE.md +0 -0
  219. {platformforge-0.2.1 → platformforge-0.2.2}/CAPABILITIES.md +0 -0
  220. {platformforge-0.2.1 → platformforge-0.2.2}/CAPACITY.md +0 -0
  221. {platformforge-0.2.1 → platformforge-0.2.2}/CLI-REFERENCE.md +0 -0
  222. {platformforge-0.2.1 → platformforge-0.2.2}/CLOUD.md +0 -0
  223. {platformforge-0.2.1 → platformforge-0.2.2}/CODE_OF_CONDUCT.md +0 -0
  224. {platformforge-0.2.1 → platformforge-0.2.2}/COLLECTORS.md +0 -0
  225. {platformforge-0.2.1 → platformforge-0.2.2}/COMPATIBILITY.md +0 -0
  226. {platformforge-0.2.1 → platformforge-0.2.2}/CONTRIBUTING.md +0 -0
  227. {platformforge-0.2.1 → platformforge-0.2.2}/CREDITS.md +0 -0
  228. {platformforge-0.2.1 → platformforge-0.2.2}/DEPRECATION.md +0 -0
  229. {platformforge-0.2.1 → platformforge-0.2.2}/DOMAIN-MAP.md +0 -0
  230. {platformforge-0.2.1 → platformforge-0.2.2}/ECONOMY.md +0 -0
  231. {platformforge-0.2.1 → platformforge-0.2.2}/ENTERPRISE.md +0 -0
  232. {platformforge-0.2.1 → platformforge-0.2.2}/EVALS.md +0 -0
  233. {platformforge-0.2.1 → platformforge-0.2.2}/EXECUTION.md +0 -0
  234. {platformforge-0.2.1 → platformforge-0.2.2}/FEDERATION.md +0 -0
  235. {platformforge-0.2.1 → platformforge-0.2.2}/FLEET.md +0 -0
  236. {platformforge-0.2.1 → platformforge-0.2.2}/GLOSSARY.md +0 -0
  237. {platformforge-0.2.1 → platformforge-0.2.2}/GOLDEN-PATH-ANALYTICS.md +0 -0
  238. {platformforge-0.2.1 → platformforge-0.2.2}/GOLDEN-PATHS.md +0 -0
  239. {platformforge-0.2.1 → platformforge-0.2.2}/GRAPHFY.md +0 -0
  240. {platformforge-0.2.1 → platformforge-0.2.2}/INCIDENTS.md +0 -0
  241. {platformforge-0.2.1 → platformforge-0.2.2}/KNOWLEDGE.md +0 -0
  242. {platformforge-0.2.1 → platformforge-0.2.2}/LICENSE +0 -0
  243. {platformforge-0.2.1 → platformforge-0.2.2}/LIVE.md +0 -0
  244. {platformforge-0.2.1 → platformforge-0.2.2}/MCP.md +0 -0
  245. {platformforge-0.2.1 → platformforge-0.2.2}/MULTI-CLUSTER.md +0 -0
  246. {platformforge-0.2.1 → platformforge-0.2.2}/OBSERVATION-MODEL.md +0 -0
  247. {platformforge-0.2.1 → platformforge-0.2.2}/OPS.md +0 -0
  248. {platformforge-0.2.1 → platformforge-0.2.2}/OPTIMIZATION.md +0 -0
  249. {platformforge-0.2.1 → platformforge-0.2.2}/PLATFORM-ANALYTICS.md +0 -0
  250. {platformforge-0.2.1 → platformforge-0.2.2}/PLATFORM-MEASUREMENT.md +0 -0
  251. {platformforge-0.2.1 → platformforge-0.2.2}/POLICY-INTELLIGENCE.md +0 -0
  252. {platformforge-0.2.1 → platformforge-0.2.2}/QUALITY-PER-TOKEN.md +0 -0
  253. {platformforge-0.2.1 → platformforge-0.2.2}/README.md +0 -0
  254. {platformforge-0.2.1 → platformforge-0.2.2}/README.pt-BR.md +0 -0
  255. {platformforge-0.2.1 → platformforge-0.2.2}/RECONCILIATION.md +0 -0
  256. {platformforge-0.2.1 → platformforge-0.2.2}/RESEARCH.md +0 -0
  257. {platformforge-0.2.1 → platformforge-0.2.2}/ROADMAP.md +0 -0
  258. {platformforge-0.2.1 → platformforge-0.2.2}/ROLLBACK.md +0 -0
  259. {platformforge-0.2.1 → platformforge-0.2.2}/RULES.md +0 -0
  260. {platformforge-0.2.1 → platformforge-0.2.2}/RUNBOOKS.md +0 -0
  261. {platformforge-0.2.1 → platformforge-0.2.2}/RUNTIME-TOPOLOGY.md +0 -0
  262. {platformforge-0.2.1 → platformforge-0.2.2}/SDD.md +0 -0
  263. {platformforge-0.2.1 → platformforge-0.2.2}/SECURITY.md +0 -0
  264. {platformforge-0.2.1 → platformforge-0.2.2}/SOURCES.md +0 -0
  265. {platformforge-0.2.1 → platformforge-0.2.2}/SUPPORT.md +0 -0
  266. {platformforge-0.2.1 → platformforge-0.2.2}/VERIFICATION.md +0 -0
  267. {platformforge-0.2.1 → platformforge-0.2.2}/agents/pf-extractor.md +0 -0
  268. {platformforge-0.2.1 → platformforge-0.2.2}/agents/pf-graph-builder.md +0 -0
  269. {platformforge-0.2.1 → platformforge-0.2.2}/agents/pf-inventory.md +0 -0
  270. {platformforge-0.2.1 → platformforge-0.2.2}/agents/pf-judge.md +0 -0
  271. {platformforge-0.2.1 → platformforge-0.2.2}/agents/pf-reconciler.md +0 -0
  272. {platformforge-0.2.1 → platformforge-0.2.2}/agents/pf-simulator.md +0 -0
  273. {platformforge-0.2.1 → platformforge-0.2.2}/agents/pf-synthesizer.md +0 -0
  274. {platformforge-0.2.1 → platformforge-0.2.2}/agents/pf-verifier.md +0 -0
  275. {platformforge-0.2.1 → platformforge-0.2.2}/agents/platform-adversarial-critic.md +0 -0
  276. {platformforge-0.2.1 → platformforge-0.2.2}/agents/platform-ai-infra-specialist.md +0 -0
  277. {platformforge-0.2.1 → platformforge-0.2.2}/agents/platform-architecture-reviewer.md +0 -0
  278. {platformforge-0.2.1 → platformforge-0.2.2}/agents/platform-aws-specialist.md +0 -0
  279. {platformforge-0.2.1 → platformforge-0.2.2}/agents/platform-capacity-specialist.md +0 -0
  280. {platformforge-0.2.1 → platformforge-0.2.2}/agents/platform-change-coordinator.md +0 -0
  281. {platformforge-0.2.1 → platformforge-0.2.2}/agents/platform-crossplane-specialist.md +0 -0
  282. {platformforge-0.2.1 → platformforge-0.2.2}/agents/platform-debate-referee.md +0 -0
  283. {platformforge-0.2.1 → platformforge-0.2.2}/agents/platform-economy-reviewer.md +0 -0
  284. {platformforge-0.2.1 → platformforge-0.2.2}/agents/platform-evidence-reviewer.md +0 -0
  285. {platformforge-0.2.1 → platformforge-0.2.2}/agents/platform-federation-specialist.md +0 -0
  286. {platformforge-0.2.1 → platformforge-0.2.2}/agents/platform-finops-specialist.md +0 -0
  287. {platformforge-0.2.1 → platformforge-0.2.2}/agents/platform-fleet-coordinator.md +0 -0
  288. {platformforge-0.2.1 → platformforge-0.2.2}/agents/platform-fleet-specialist.md +0 -0
  289. {platformforge-0.2.1 → platformforge-0.2.2}/agents/platform-gitops-specialist.md +0 -0
  290. {platformforge-0.2.1 → platformforge-0.2.2}/agents/platform-graph-specialist.md +0 -0
  291. {platformforge-0.2.1 → platformforge-0.2.2}/agents/platform-iac-specialist.md +0 -0
  292. {platformforge-0.2.1 → platformforge-0.2.2}/agents/platform-incident-coordinator.md +0 -0
  293. {platformforge-0.2.1 → platformforge-0.2.2}/agents/platform-kubernetes-specialist.md +0 -0
  294. {platformforge-0.2.1 → platformforge-0.2.2}/agents/platform-operations-safety-reviewer.md +0 -0
  295. {platformforge-0.2.1 → platformforge-0.2.2}/agents/platform-optimization-coordinator.md +0 -0
  296. {platformforge-0.2.1 → platformforge-0.2.2}/agents/platform-orchestrator.md +0 -0
  297. {platformforge-0.2.1 → platformforge-0.2.2}/agents/platform-planner.md +0 -0
  298. {platformforge-0.2.1 → platformforge-0.2.2}/agents/platform-policy-specialist.md +0 -0
  299. {platformforge-0.2.1 → platformforge-0.2.2}/agents/platform-privacy-reviewer.md +0 -0
  300. {platformforge-0.2.1 → platformforge-0.2.2}/agents/platform-product-coordinator.md +0 -0
  301. {platformforge-0.2.1 → platformforge-0.2.2}/agents/platform-product-specialist.md +0 -0
  302. {platformforge-0.2.1 → platformforge-0.2.2}/agents/platform-release-guardian.md +0 -0
  303. {platformforge-0.2.1 → platformforge-0.2.2}/agents/platform-security-reviewer.md +0 -0
  304. {platformforge-0.2.1 → platformforge-0.2.2}/agents/platform-security-specialist.md +0 -0
  305. {platformforge-0.2.1 → platformforge-0.2.2}/agents/platform-sre-specialist.md +0 -0
  306. {platformforge-0.2.1 → platformforge-0.2.2}/agents/platform-task-spec-reviewer.md +0 -0
  307. {platformforge-0.2.1 → platformforge-0.2.2}/agents/platform-verifier.md +0 -0
  308. {platformforge-0.2.1 → platformforge-0.2.2}/config.example.yaml +0 -0
  309. {platformforge-0.2.1 → platformforge-0.2.2}/contracts/agent-handoff.schema.json +0 -0
  310. {platformforge-0.2.1 → platformforge-0.2.2}/contracts/agent-run.schema.json +0 -0
  311. {platformforge-0.2.1 → platformforge-0.2.2}/contracts/agent-spec.schema.json +0 -0
  312. {platformforge-0.2.1 → platformforge-0.2.2}/contracts/capability.schema.json +0 -0
  313. {platformforge-0.2.1 → platformforge-0.2.2}/contracts/change-event.schema.json +0 -0
  314. {platformforge-0.2.1 → platformforge-0.2.2}/contracts/change-intent.schema.json +0 -0
  315. {platformforge-0.2.1 → platformforge-0.2.2}/contracts/change-plan.schema.json +0 -0
  316. {platformforge-0.2.1 → platformforge-0.2.2}/contracts/collector-receipt.schema.json +0 -0
  317. {platformforge-0.2.1 → platformforge-0.2.2}/contracts/context-pack.schema.json +0 -0
  318. {platformforge-0.2.1 → platformforge-0.2.2}/contracts/debate.schema.json +0 -0
  319. {platformforge-0.2.1 → platformforge-0.2.2}/contracts/distribution-manifest-v1.schema.json +0 -0
  320. {platformforge-0.2.1 → platformforge-0.2.2}/contracts/drift-event.schema.json +0 -0
  321. {platformforge-0.2.1 → platformforge-0.2.2}/contracts/fact.schema.json +0 -0
  322. {platformforge-0.2.1 → platformforge-0.2.2}/contracts/finding.schema.json +0 -0
  323. {platformforge-0.2.1 → platformforge-0.2.2}/contracts/graph-v2.schema.json +0 -0
  324. {platformforge-0.2.1 → platformforge-0.2.2}/contracts/graph.schema.json +0 -0
  325. {platformforge-0.2.1 → platformforge-0.2.2}/contracts/install-receipt-v1.schema.json +0 -0
  326. {platformforge-0.2.1 → platformforge-0.2.2}/contracts/observation.schema.json +0 -0
  327. {platformforge-0.2.1 → platformforge-0.2.2}/contracts/receipt.schema.json +0 -0
  328. {platformforge-0.2.1 → platformforge-0.2.2}/contracts/recommendation.schema.json +0 -0
  329. {platformforge-0.2.1 → platformforge-0.2.2}/contracts/refusal.schema.json +0 -0
  330. {platformforge-0.2.1 → platformforge-0.2.2}/contracts/slo-contract.schema.json +0 -0
  331. {platformforge-0.2.1 → platformforge-0.2.2}/contracts/task-spec.schema.json +0 -0
  332. {platformforge-0.2.1 → platformforge-0.2.2}/contracts/workspace-manifest-v1.schema.json +0 -0
  333. {platformforge-0.2.1 → platformforge-0.2.2}/docs/CLI-SURFACE.md +0 -0
  334. {platformforge-0.2.1 → platformforge-0.2.2}/docs/INDEX.md +0 -0
  335. {platformforge-0.2.1 → platformforge-0.2.2}/docs/README.md +0 -0
  336. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0001-deterministic-core-first.md +0 -0
  337. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0002-graphfy-as-spine.md +0 -0
  338. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0003-economy-by-architecture.md +0 -0
  339. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0004-planned-provenance.md +0 -0
  340. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0005-context-redaction.md +0 -0
  341. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0006-rule-provenance.md +0 -0
  342. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0007-version-unresolved-semantics.md +0 -0
  343. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0008-quality-per-token.md +0 -0
  344. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0009-cloud-common-model.md +0 -0
  345. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0010-golden-path-model.md +0 -0
  346. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0011-observation-model.md +0 -0
  347. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0012-collector-boundary.md +0 -0
  348. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0013-absence-semantics.md +0 -0
  349. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0014-freshness-coverage.md +0 -0
  350. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0015-temporal-graphfy.md +0 -0
  351. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0016-identity-resolution.md +0 -0
  352. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0017-reconciliation-classes.md +0 -0
  353. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0018-runtime-edge-semantics.md +0 -0
  354. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0019-credential-boundary.md +0 -0
  355. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0020-provider-call-economy.md +0 -0
  356. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0021-no-arbitrary-shell.md +0 -0
  357. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0022-source-of-truth-first.md +0 -0
  358. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0023-autonomy-levels.md +0 -0
  359. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0024-risk-classes.md +0 -0
  360. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0025-approval-hash-binding.md +0 -0
  361. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0026-operation-state-machine.md +0 -0
  362. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0027-execution-adapter-boundary.md +0 -0
  363. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0028-verification-not-command-success.md +0 -0
  364. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0029-rollback-semantics.md +0 -0
  365. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0030-policy-precedence.md +0 -0
  366. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0031-fleet-canonical-model.md +0 -0
  367. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0032-org-graphfy-layers.md +0 -0
  368. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0033-history-boundaries.md +0 -0
  369. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0034-deterministic-baseline-first.md +0 -0
  370. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0035-platform-metric-provenance.md +0 -0
  371. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0036-optimization-changeintent.md +0 -0
  372. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0037-federation-no-credentials.md +0 -0
  373. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0038-no-individual-scoring.md +0 -0
  374. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0039-ai-platform-boundary.md +0 -0
  375. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0040-pluggable-analytics-storage.md +0 -0
  376. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0041-canonical-agent-roster.md +0 -0
  377. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0042-agents-vs-engines.md +0 -0
  378. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0043-coordinator-dispatch-boundary.md +0 -0
  379. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0044-verifier-independence.md +0 -0
  380. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0045-agent-budget-model.md +0 -0
  381. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0046-agent-context-economy.md +0 -0
  382. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0047-debate-referee-contract.md +0 -0
  383. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0048-host-mirror-generation.md +0 -0
  384. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0049-zero-subagent-fallback.md +0 -0
  385. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0050-agent-operation-boundary.md +0 -0
  386. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0051-fleet-scale-context-policy.md +0 -0
  387. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0052-architecture-freeze-policy.md +0 -0
  388. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0053-economy-control-plane.md +0 -0
  389. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0054-multilayer-cache-invalidation.md +0 -0
  390. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0055-context-gateway-as-the-single-context-entry-point.md +0 -0
  391. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0056-budgetenvelope-dimensions-and-hard-soft-limits.md +0 -0
  392. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0057-checkpoint-and-resume-carry-spend.md +0 -0
  393. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0058-observed-vs-estimated-accounting.md +0 -0
  394. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0059-declared-provider-pricing.md +0 -0
  395. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0060-selective-verification,-not-test-skipping.md +0 -0
  396. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0061-agent-fanout-economy.md +0 -0
  397. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0062-champion-challenger-routing.md +0 -0
  398. {platformforge-0.2.1 → platformforge-0.2.2}/docs/adr/0063-fleet-context-boundary.md +0 -0
  399. {platformforge-0.2.1 → platformforge-0.2.2}/docs/agents/AGENT_ARCHITECTURE.md +0 -0
  400. {platformforge-0.2.1 → platformforge-0.2.2}/docs/agents/AGENT_OUTPUT_CONTRACT.md +0 -0
  401. {platformforge-0.2.1 → platformforge-0.2.2}/docs/agents/AGENT_PROTOCOL.md +0 -0
  402. {platformforge-0.2.1 → platformforge-0.2.2}/docs/agents/AGENT_RISK_MATRIX.md +0 -0
  403. {platformforge-0.2.1 → platformforge-0.2.2}/docs/agents/AGENT_SKILL_MATRIX.md +0 -0
  404. {platformforge-0.2.1 → platformforge-0.2.2}/docs/agents/AGENT_TOOL_MATRIX.md +0 -0
  405. {platformforge-0.2.1 → platformforge-0.2.2}/docs/agents/DEBATE.md +0 -0
  406. {platformforge-0.2.1 → platformforge-0.2.2}/docs/agents/ECONOMY.md +0 -0
  407. {platformforge-0.2.1 → platformforge-0.2.2}/docs/agents/HOST_PARITY.md +0 -0
  408. {platformforge-0.2.1 → platformforge-0.2.2}/docs/agents/ROUTING.md +0 -0
  409. {platformforge-0.2.1 → platformforge-0.2.2}/docs/agents/VERIFICATION.md +0 -0
  410. {platformforge-0.2.1 → platformforge-0.2.2}/docs/assets/logo.png +0 -0
  411. {platformforge-0.2.1 → platformforge-0.2.2}/docs/audits/FORGE_CONTEXT_BASELINE.md +0 -0
  412. {platformforge-0.2.1 → platformforge-0.2.2}/docs/cycle2/ARCHITECTURAL-REVIEW.md +0 -0
  413. {platformforge-0.2.1 → platformforge-0.2.2}/docs/cycle2/FINAL-ECONOMY.md +0 -0
  414. {platformforge-0.2.1 → platformforge-0.2.2}/docs/cycle2/FINAL-MATRIX.md +0 -0
  415. {platformforge-0.2.1 → platformforge-0.2.2}/docs/cycle2/FINAL-QUALITY.md +0 -0
  416. {platformforge-0.2.1 → platformforge-0.2.2}/docs/cycle2/FINAL-REPORT.md +0 -0
  417. {platformforge-0.2.1 → platformforge-0.2.2}/docs/cycle2/FINAL-SECURITY.md +0 -0
  418. {platformforge-0.2.1 → platformforge-0.2.2}/docs/cycle2/NORTH-STAR.md +0 -0
  419. {platformforge-0.2.1 → platformforge-0.2.2}/docs/cycle2.1/BASELINE.md +0 -0
  420. {platformforge-0.2.1 → platformforge-0.2.2}/docs/cycle2.1/CI-VALIDATION.md +0 -0
  421. {platformforge-0.2.1 → platformforge-0.2.2}/docs/cycle2.1/FINAL-MATRIX.md +0 -0
  422. {platformforge-0.2.1 → platformforge-0.2.2}/docs/cycle2.1/VALIDATION-RECEIPT.json +0 -0
  423. {platformforge-0.2.1 → platformforge-0.2.2}/docs/cycle3/BASELINE.md +0 -0
  424. {platformforge-0.2.1 → platformforge-0.2.2}/docs/cycle3/FINAL-REPORT.md +0 -0
  425. {platformforge-0.2.1 → platformforge-0.2.2}/docs/cycle3/PROPOSAL.md +0 -0
  426. {platformforge-0.2.1 → platformforge-0.2.2}/docs/cycle3/RESEARCH-LEDGER.md +0 -0
  427. {platformforge-0.2.1 → platformforge-0.2.2}/docs/cycle4/BASELINE.md +0 -0
  428. {platformforge-0.2.1 → platformforge-0.2.2}/docs/cycle4/FINAL-REPORT.md +0 -0
  429. {platformforge-0.2.1 → platformforge-0.2.2}/docs/cycle4/RESEARCH-LEDGER.md +0 -0
  430. {platformforge-0.2.1 → platformforge-0.2.2}/docs/cycle4.1/BASELINE.md +0 -0
  431. {platformforge-0.2.1 → platformforge-0.2.2}/docs/cycle4.1/FINAL-MATRIX.md +0 -0
  432. {platformforge-0.2.1 → platformforge-0.2.2}/docs/cycle4.1/FINAL-REPORT.md +0 -0
  433. {platformforge-0.2.1 → platformforge-0.2.2}/docs/cycle4.1/VALIDATION-RECEIPT.md +0 -0
  434. {platformforge-0.2.1 → platformforge-0.2.2}/docs/cycle5/BASELINE.md +0 -0
  435. {platformforge-0.2.1 → platformforge-0.2.2}/docs/cycle5/ECONOMY-REPORT.md +0 -0
  436. {platformforge-0.2.1 → platformforge-0.2.2}/docs/cycle5/ENTERPRISE-REVIEW.md +0 -0
  437. {platformforge-0.2.1 → platformforge-0.2.2}/docs/cycle5/FINAL-MATRIX.md +0 -0
  438. {platformforge-0.2.1 → platformforge-0.2.2}/docs/cycle5/FINAL-REPORT.md +0 -0
  439. {platformforge-0.2.1 → platformforge-0.2.2}/docs/cycle5/OPTIMIZATION-REPORT.md +0 -0
  440. {platformforge-0.2.1 → platformforge-0.2.2}/docs/cycle5/RESEARCH-LEDGER.md +0 -0
  441. {platformforge-0.2.1 → platformforge-0.2.2}/docs/cycle5/SCALE-BENCHMARKS.md +0 -0
  442. {platformforge-0.2.1 → platformforge-0.2.2}/docs/cycle5/SECURITY-PRIVACY-REVIEW.md +0 -0
  443. {platformforge-0.2.1 → platformforge-0.2.2}/docs/cycle5/VALIDATION-RECEIPT.json +0 -0
  444. {platformforge-0.2.1 → platformforge-0.2.2}/docs/cycle5.1/AGENT-BENCHMARKS.md +0 -0
  445. {platformforge-0.2.1 → platformforge-0.2.2}/docs/cycle5.1/AGENT-MATRIX.md +0 -0
  446. {platformforge-0.2.1 → platformforge-0.2.2}/docs/cycle5.1/AGENTIC-RUNTIME-REPORT.md +0 -0
  447. {platformforge-0.2.1 → platformforge-0.2.2}/docs/cycle5.1/BASELINE.md +0 -0
  448. {platformforge-0.2.1 → platformforge-0.2.2}/docs/cycle5.1/FINAL-MATRIX.md +0 -0
  449. {platformforge-0.2.1 → platformforge-0.2.2}/docs/cycle5.1/FINAL-REPORT.md +0 -0
  450. {platformforge-0.2.1 → platformforge-0.2.2}/docs/cycle5.1/FREEZE-REVIEW.md +0 -0
  451. {platformforge-0.2.1 → platformforge-0.2.2}/docs/cycle5.1/SCALE-BENCHMARKS.md +0 -0
  452. {platformforge-0.2.1 → platformforge-0.2.2}/docs/cycle5.1/SOAK-REPORT.md +0 -0
  453. {platformforge-0.2.1 → platformforge-0.2.2}/docs/cycle5.1/VALIDATION-RECEIPT.json +0 -0
  454. {platformforge-0.2.1 → platformforge-0.2.2}/docs/discovery/forge-audit.md +0 -0
  455. {platformforge-0.2.1 → platformforge-0.2.2}/docs/economy/AGENTIC-ECONOMY.md +0 -0
  456. {platformforge-0.2.1 → platformforge-0.2.2}/docs/economy/ARCHITECTURE.md +0 -0
  457. {platformforge-0.2.1 → platformforge-0.2.2}/docs/economy/BUDGETS.md +0 -0
  458. {platformforge-0.2.1 → platformforge-0.2.2}/docs/economy/CACHE.md +0 -0
  459. {platformforge-0.2.1 → platformforge-0.2.2}/docs/economy/CHECKPOINT-RESUME.md +0 -0
  460. {platformforge-0.2.1 → platformforge-0.2.2}/docs/economy/CONTEXT-GATEWAY.md +0 -0
  461. {platformforge-0.2.1 → platformforge-0.2.2}/docs/economy/PRICING.md +0 -0
  462. {platformforge-0.2.1 → platformforge-0.2.2}/docs/economy/RECONCILIATION.md +0 -0
  463. {platformforge-0.2.1 → platformforge-0.2.2}/docs/economy/ROUTING.md +0 -0
  464. {platformforge-0.2.1 → platformforge-0.2.2}/docs/economy/VERIFICATION-ECONOMY.md +0 -0
  465. {platformforge-0.2.1 → platformforge-0.2.2}/docs/economy-parity/AGENTIC-ECONOMY-REPORT.md +0 -0
  466. {platformforge-0.2.1 → platformforge-0.2.2}/docs/economy-parity/BASELINE.md +0 -0
  467. {platformforge-0.2.1 → platformforge-0.2.2}/docs/economy-parity/BENCHMARKS.json +0 -0
  468. {platformforge-0.2.1 → platformforge-0.2.2}/docs/economy-parity/CACHE-REPORT.md +0 -0
  469. {platformforge-0.2.1 → platformforge-0.2.2}/docs/economy-parity/ECONOMY-BENCHMARKS.md +0 -0
  470. {platformforge-0.2.1 → platformforge-0.2.2}/docs/economy-parity/FINAL-MATRIX.md +0 -0
  471. {platformforge-0.2.1 → platformforge-0.2.2}/docs/economy-parity/FINAL-REPORT.md +0 -0
  472. {platformforge-0.2.1 → platformforge-0.2.2}/docs/economy-parity/GAP-MATRIX.md +0 -0
  473. {platformforge-0.2.1 → platformforge-0.2.2}/docs/economy-parity/POLISH-BASELINE.md +0 -0
  474. {platformforge-0.2.1 → platformforge-0.2.2}/docs/economy.md +0 -0
  475. {platformforge-0.2.1 → platformforge-0.2.2}/docs/engineering-excellence/fitness-and-gates.md +0 -0
  476. {platformforge-0.2.1 → platformforge-0.2.2}/docs/evals-taxonomy.md +0 -0
  477. {platformforge-0.2.1 → platformforge-0.2.2}/docs/experience/accessibility.md +0 -0
  478. {platformforge-0.2.1 → platformforge-0.2.2}/docs/experience/automation-mode.md +0 -0
  479. {platformforge-0.2.1 → platformforge-0.2.2}/docs/experience/fase4-report.md +0 -0
  480. {platformforge-0.2.1 → platformforge-0.2.2}/docs/experience/installation-wizard.md +0 -0
  481. {platformforge-0.2.1 → platformforge-0.2.2}/docs/experience/interactive-cli.md +0 -0
  482. {platformforge-0.2.1 → platformforge-0.2.2}/docs/experience/themes.md +0 -0
  483. {platformforge-0.2.1 → platformforge-0.2.2}/docs/freeze/AGENTIC-RECEIPT.json +0 -0
  484. {platformforge-0.2.1 → platformforge-0.2.2}/docs/freeze/ARCHITECTURE-FREEZE-REVIEW.md +0 -0
  485. {platformforge-0.2.1 → platformforge-0.2.2}/docs/freeze/DOGFOOD.md +0 -0
  486. {platformforge-0.2.1 → platformforge-0.2.2}/docs/freeze/FINAL-MATRIX.md +0 -0
  487. {platformforge-0.2.1 → platformforge-0.2.2}/docs/freeze/FINAL-REPORT.md +0 -0
  488. {platformforge-0.2.1 → platformforge-0.2.2}/docs/freeze/FREEZE-MANIFEST.md +0 -0
  489. {platformforge-0.2.1 → platformforge-0.2.2}/docs/freeze/KNOWLEDGE-REVIEW.md +0 -0
  490. {platformforge-0.2.1 → platformforge-0.2.2}/docs/freeze/LICENSE-INVENTORY.txt +0 -0
  491. {platformforge-0.2.1 → platformforge-0.2.2}/docs/freeze/LIFECYCLE.md +0 -0
  492. {platformforge-0.2.1 → platformforge-0.2.2}/docs/freeze/PERFORMANCE-BASELINE.json +0 -0
  493. {platformforge-0.2.1 → platformforge-0.2.2}/docs/freeze/PERFORMANCE-RECEIPT.json +0 -0
  494. {platformforge-0.2.1 → platformforge-0.2.2}/docs/freeze/README.md +0 -0
  495. {platformforge-0.2.1 → platformforge-0.2.2}/docs/freeze/REAL-WORLD-ISSUES.md +0 -0
  496. {platformforge-0.2.1 → platformforge-0.2.2}/docs/freeze/RELEASE-HARDENING.md +0 -0
  497. {platformforge-0.2.1 → platformforge-0.2.2}/docs/freeze/SBOM.cdx.json +0 -0
  498. {platformforge-0.2.1 → platformforge-0.2.2}/docs/freeze/SECURITY-REVIEW.md +0 -0
  499. {platformforge-0.2.1 → platformforge-0.2.2}/docs/freeze/SOAK-RECEIPT.json +0 -0
  500. {platformforge-0.2.1 → platformforge-0.2.2}/docs/freeze/UNFREEZE-RFC.md +0 -0
  501. {platformforge-0.2.1 → platformforge-0.2.2}/docs/freeze/VALIDATION-RECEIPT.json +0 -0
  502. {platformforge-0.2.1 → platformforge-0.2.2}/docs/freeze/dogfood/api-collect.json +0 -0
  503. {platformforge-0.2.1 → platformforge-0.2.2}/docs/freeze/dogfood/api-inspect.json +0 -0
  504. {platformforge-0.2.1 → platformforge-0.2.2}/docs/freeze/dogfood/context-audit.json +0 -0
  505. {platformforge-0.2.1 → platformforge-0.2.2}/docs/freeze/dogfood/route-audit.json +0 -0
  506. {platformforge-0.2.1 → platformforge-0.2.2}/docs/freeze/dogfood/self-analyze-iac.json +0 -0
  507. {platformforge-0.2.1 → platformforge-0.2.2}/docs/freeze/dogfood/self-analyze-k8s.json +0 -0
  508. {platformforge-0.2.1 → platformforge-0.2.2}/docs/freeze/dogfood/self-analyze-secrets.json +0 -0
  509. {platformforge-0.2.1 → platformforge-0.2.2}/docs/freeze/dogfood/self-collect.json +0 -0
  510. {platformforge-0.2.1 → platformforge-0.2.2}/docs/freeze/dogfood/self-graph.json +0 -0
  511. {platformforge-0.2.1 → platformforge-0.2.2}/docs/freeze/dogfood/self-inspect.json +0 -0
  512. {platformforge-0.2.1 → platformforge-0.2.2}/docs/freeze/dogfood/spark-collect.json +0 -0
  513. {platformforge-0.2.1 → platformforge-0.2.2}/docs/freeze/dogfood/spark-inspect.json +0 -0
  514. {platformforge-0.2.1 → platformforge-0.2.2}/docs/freeze/exceptions/FE-000-template.json +0 -0
  515. {platformforge-0.2.1 → platformforge-0.2.2}/docs/freeze/exceptions/FE-001.json +0 -0
  516. {platformforge-0.2.1 → platformforge-0.2.2}/docs/freeze/exceptions/FE-002.json +0 -0
  517. {platformforge-0.2.1 → platformforge-0.2.2}/docs/freeze/exceptions/FE-003.json +0 -0
  518. {platformforge-0.2.1 → platformforge-0.2.2}/docs/freeze/exceptions/FE-004.json +0 -0
  519. {platformforge-0.2.1 → platformforge-0.2.2}/docs/freeze/rfc/RFC-ECONOMY-UNFREEZE.md +0 -0
  520. {platformforge-0.2.1 → platformforge-0.2.2}/docs/freeze/rfc/RFC-PORTABLE-DISTRIBUTION.md +0 -0
  521. {platformforge-0.2.1 → platformforge-0.2.2}/docs/freeze/snapshots/agents.json +0 -0
  522. {platformforge-0.2.1 → platformforge-0.2.2}/docs/freeze/snapshots/capabilities.json +0 -0
  523. {platformforge-0.2.1 → platformforge-0.2.2}/docs/freeze/snapshots/cli.json +0 -0
  524. {platformforge-0.2.1 → platformforge-0.2.2}/docs/freeze/snapshots/knowledge.json +0 -0
  525. {platformforge-0.2.1 → platformforge-0.2.2}/docs/freeze/snapshots/mcp.json +0 -0
  526. {platformforge-0.2.1 → platformforge-0.2.2}/docs/freeze/snapshots/schemas.json +0 -0
  527. {platformforge-0.2.1 → platformforge-0.2.2}/docs/install/DISTRIBUTION_PARITY.md +0 -0
  528. {platformforge-0.2.1 → platformforge-0.2.2}/docs/installation/account-installation.md +0 -0
  529. {platformforge-0.2.1 → platformforge-0.2.2}/docs/installation/claude-code.md +0 -0
  530. {platformforge-0.2.1 → platformforge-0.2.2}/docs/installation/codex-cli.md +0 -0
  531. {platformforge-0.2.1 → platformforge-0.2.2}/docs/installation/copilot-cli.md +0 -0
  532. {platformforge-0.2.1 → platformforge-0.2.2}/docs/installation/devin-cli.md +0 -0
  533. {platformforge-0.2.1 → platformforge-0.2.2}/docs/installation/global-installation.md +0 -0
  534. {platformforge-0.2.1 → platformforge-0.2.2}/docs/installation/mcp.md +0 -0
  535. {platformforge-0.2.1 → platformforge-0.2.2}/docs/installation/portable-installation.md +0 -0
  536. {platformforge-0.2.1 → platformforge-0.2.2}/docs/installation/quickstart.en.md +0 -0
  537. {platformforge-0.2.1 → platformforge-0.2.2}/docs/installation/quickstart.md +0 -0
  538. {platformforge-0.2.1 → platformforge-0.2.2}/docs/installation/troubleshooting.en.md +0 -0
  539. {platformforge-0.2.1 → platformforge-0.2.2}/docs/installation/troubleshooting.md +0 -0
  540. {platformforge-0.2.1 → platformforge-0.2.2}/docs/installation/uninstall.md +0 -0
  541. {platformforge-0.2.1 → platformforge-0.2.2}/docs/installation/update-and-repair.md +0 -0
  542. {platformforge-0.2.1 → platformforge-0.2.2}/docs/installation/workspace-installation.md +0 -0
  543. {platformforge-0.2.1 → platformforge-0.2.2}/docs/knowledge-program/broken-link-report.md +0 -0
  544. {platformforge-0.2.1 → platformforge-0.2.2}/docs/knowledge-program/classification-report.md +0 -0
  545. {platformforge-0.2.1 → platformforge-0.2.2}/docs/knowledge-program/command-drift-report.md +0 -0
  546. {platformforge-0.2.1 → platformforge-0.2.2}/docs/knowledge-program/context-map.jsonl +0 -0
  547. {platformforge-0.2.1 → platformforge-0.2.2}/docs/knowledge-program/documentation-quality-report.md +0 -0
  548. {platformforge-0.2.1 → platformforge-0.2.2}/docs/knowledge-program/duplicate-content-report.md +0 -0
  549. {platformforge-0.2.1 → platformforge-0.2.2}/docs/knowledge-program/final-report.md +0 -0
  550. {platformforge-0.2.1 → platformforge-0.2.2}/docs/knowledge-program/inventory.jsonl +0 -0
  551. {platformforge-0.2.1 → platformforge-0.2.2}/docs/knowledge-program/obsolete-document-report.md +0 -0
  552. {platformforge-0.2.1 → platformforge-0.2.2}/docs/knowledge-program/pipeline.json +0 -0
  553. {platformforge-0.2.1 → platformforge-0.2.2}/docs/knowledge-program/semantic-review-ledger.jsonl +0 -0
  554. {platformforge-0.2.1 → platformforge-0.2.2}/docs/knowledge-program/tutorial-coverage-report.md +0 -0
  555. {platformforge-0.2.1 → platformforge-0.2.2}/docs/learn/README.md +0 -0
  556. {platformforge-0.2.1 → platformforge-0.2.2}/docs/learn/recipes/cicd.md +0 -0
  557. {platformforge-0.2.1 → platformforge-0.2.2}/docs/learn/recipes/custos.md +0 -0
  558. {platformforge-0.2.1 → platformforge-0.2.2}/docs/learn/recipes/graph-deps.md +0 -0
  559. {platformforge-0.2.1 → platformforge-0.2.2}/docs/learn/recipes/graph-studio.md +0 -0
  560. {platformforge-0.2.1 → platformforge-0.2.2}/docs/learn/recipes/hosts.md +0 -0
  561. {platformforge-0.2.1 → platformforge-0.2.2}/docs/learn/recipes/impacto-blast.md +0 -0
  562. {platformforge-0.2.1 → platformforge-0.2.2}/docs/learn/recipes/inspect-repo.md +0 -0
  563. {platformforge-0.2.1 → platformforge-0.2.2}/docs/learn/recipes/judge-policy.md +0 -0
  564. {platformforge-0.2.1 → platformforge-0.2.2}/docs/learn/recipes/kubernetes.md +0 -0
  565. {platformforge-0.2.1 → platformforge-0.2.2}/docs/learn/recipes/seguranca.md +0 -0
  566. {platformforge-0.2.1 → platformforge-0.2.2}/docs/learn/recipes/sre.md +0 -0
  567. {platformforge-0.2.1 → platformforge-0.2.2}/docs/learn/recipes/terraform.md +0 -0
  568. {platformforge-0.2.1 → platformforge-0.2.2}/docs/learn/recipes/usar-agents.md +0 -0
  569. {platformforge-0.2.1 → platformforge-0.2.2}/docs/learn/recipes/usar-skills.md +0 -0
  570. {platformforge-0.2.1 → platformforge-0.2.2}/docs/learn/recipes/verificar-mcp.md +0 -0
  571. {platformforge-0.2.1 → platformforge-0.2.2}/docs/portable/ARCHITECTURE.md +0 -0
  572. {platformforge-0.2.1 → platformforge-0.2.2}/docs/portable/FINAL-MATRIX.md +0 -0
  573. {platformforge-0.2.1 → platformforge-0.2.2}/docs/portable/FINAL-REPORT.md +0 -0
  574. {platformforge-0.2.1 → platformforge-0.2.2}/docs/portable/INSTALL.md +0 -0
  575. {platformforge-0.2.1 → platformforge-0.2.2}/docs/portable/OFFLINE.md +0 -0
  576. {platformforge-0.2.1 → platformforge-0.2.2}/docs/portable/WORKSPACES.md +0 -0
  577. {platformforge-0.2.1 → platformforge-0.2.2}/docs/reference/agents.md +0 -0
  578. {platformforge-0.2.1 → platformforge-0.2.2}/docs/reference/command-rationale.json +0 -0
  579. {platformforge-0.2.1 → platformforge-0.2.2}/docs/reference/commands.generated.json +0 -0
  580. {platformforge-0.2.1 → platformforge-0.2.2}/docs/reference/commands.md +0 -0
  581. {platformforge-0.2.1 → platformforge-0.2.2}/docs/reference/divergence.generated.json +0 -0
  582. {platformforge-0.2.1 → platformforge-0.2.2}/docs/reference/skills.md +0 -0
  583. {platformforge-0.2.1 → platformforge-0.2.2}/docs/releasing/pypi-patch-plan.md +0 -0
  584. {platformforge-0.2.1 → platformforge-0.2.2}/docs/reports/experience-3.md +0 -0
  585. {platformforge-0.2.1 → platformforge-0.2.2}/docs/tutorials/first-run.md +0 -0
  586. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/agent-budget-exhaustion/case.yaml +0 -0
  587. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/agent-conflicting-specialists/case.yaml +0 -0
  588. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/agent-fleet-optimization/case.yaml +0 -0
  589. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/agent-host-no-subagents/case.yaml +0 -0
  590. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/agent-incident-multi/case.yaml +0 -0
  591. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/agent-missing-evidence/case.yaml +0 -0
  592. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/agent-multi-domain-audit/case.yaml +0 -0
  593. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/agent-production-change/case.yaml +0 -0
  594. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/agent-security-mandatory/case.yaml +0 -0
  595. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/agent-simple-iac/case.yaml +0 -0
  596. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/approval-integrity-seal/case.yaml +0 -0
  597. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/capacity-hot/case.yaml +0 -0
  598. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/capacity-hot/fixture/capacity.json +0 -0
  599. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/catalog-noowner/case.yaml +0 -0
  600. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/catalog-noowner/fixture/catalog-info.yaml +0 -0
  601. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/contract-fact/case.yaml +0 -0
  602. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/contract-fact/fixture/doc.json +0 -0
  603. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/cosign-unverified/case.yaml +0 -0
  604. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/cosign-unverified/fixture/sig.json +0 -0
  605. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/expected-delta-refusal/case.yaml +0 -0
  606. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/finops-noattr/case.yaml +0 -0
  607. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/finops-noattr/fixture/costs.json +0 -0
  608. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/fleet-inv-absent-allocation-unknown/case.yaml +0 -0
  609. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/fleet-inv-centrality-not-criticality/case.yaml +0 -0
  610. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/fleet-inv-correlation-not-causality/case.yaml +0 -0
  611. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/fleet-inv-dx-no-person-metrics/case.yaml +0 -0
  612. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/fleet-inv-federation-restricted-denied/case.yaml +0 -0
  613. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/fleet-inv-federation-secret-denied/case.yaml +0 -0
  614. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/fleet-inv-history-window-deterministic/case.yaml +0 -0
  615. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/fleet-inv-low-util-not-deletable/case.yaml +0 -0
  616. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/fleet-inv-member-key-deterministic/case.yaml +0 -0
  617. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/fleet-inv-missing-denominator/case.yaml +0 -0
  618. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/fleet-inv-partial-coverage-visible/case.yaml +0 -0
  619. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/fleet-inv-plan-changeintent-only/case.yaml +0 -0
  620. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/fleet-inv-report-all-cited/case.yaml +0 -0
  621. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/fleet-inv-small-sample-confidence/case.yaml +0 -0
  622. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/fleet-inv-uncertain-optimization-suppressed/case.yaml +0 -0
  623. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/gha-dangerous/case.yaml +0 -0
  624. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/gha-dangerous/fixture/.github/workflows/ci.yaml +0 -0
  625. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/gitops-v2/case.yaml +0 -0
  626. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/gitops-v2/fixture/argo.yaml +0 -0
  627. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/graph-k8s-blast/case.yaml +0 -0
  628. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/graph-k8s-blast/fixture/deploy.yaml +0 -0
  629. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/iac-module-nopin/case.yaml +0 -0
  630. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/iac-module-nopin/fixture/main.tf +0 -0
  631. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/iac-plan-replace/case.yaml +0 -0
  632. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/iac-plan-replace/fixture/plan.json +0 -0
  633. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/iac-sg-open/case.yaml +0 -0
  634. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/iac-sg-open/fixture/main.tf +0 -0
  635. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/iam-oidc/case.yaml +0 -0
  636. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/iam-oidc/fixture/policy.json +0 -0
  637. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/iam-wildcard-positive/case.yaml +0 -0
  638. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/iam-wildcard-positive/fixture/policy.json +0 -0
  639. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/k8s-bad-actor/case.yaml +0 -0
  640. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/k8s-bad-actor/fixture/app.yaml +0 -0
  641. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/k8s-beta-api/case.yaml +0 -0
  642. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/k8s-beta-api/fixture/cr.yaml +0 -0
  643. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/k8s-dep-api-boundary/case.yaml +0 -0
  644. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/k8s-dep-api-boundary/fixture/app.yaml +0 -0
  645. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/k8s-dep-api-clean/case.yaml +0 -0
  646. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/k8s-dep-api-clean/fixture/app.yaml +0 -0
  647. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/k8s-dep-api-unknown/case.yaml +0 -0
  648. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/k8s-dep-api-unknown/fixture/app.yaml +0 -0
  649. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/k8s-dep-api-v120/case.yaml +0 -0
  650. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/k8s-dep-api-v120/fixture/app.yaml +0 -0
  651. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/k8s-dep-api-v129/case.yaml +0 -0
  652. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/k8s-dep-api-v129/fixture/app.yaml +0 -0
  653. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/k8s-hpa-noreq/case.yaml +0 -0
  654. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/k8s-hpa-noreq/fixture/app.yaml +0 -0
  655. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/k8s-limits-boundary/case.yaml +0 -0
  656. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/k8s-limits-boundary/fixture/app.yaml +0 -0
  657. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/k8s-limits-negative/case.yaml +0 -0
  658. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/k8s-limits-negative/fixture/deploy.yaml +0 -0
  659. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/k8s-limits-positive/case.yaml +0 -0
  660. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/k8s-limits-positive/fixture/deploy.yaml +0 -0
  661. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/k8s-nopdb/case.yaml +0 -0
  662. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/k8s-nopdb/fixture/app.yaml +0 -0
  663. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/knowledge-registry/case.yaml +0 -0
  664. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/kyverno-dep/case.yaml +0 -0
  665. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/kyverno-dep/fixture/pol.yaml +0 -0
  666. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/kyverno-legacy/case.yaml +0 -0
  667. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/kyverno-legacy/fixture/pol.yaml +0 -0
  668. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/live-aws-collect/case.yaml +0 -0
  669. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/live-aws-collect/fixture/aws/ec2_describe-vpcs.json +0 -0
  670. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/live-aws-collect/fixture/aws/iam_list-users.denied.txt +0 -0
  671. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/live-aws-collect/fixture/aws/sts_get-caller-identity.json +0 -0
  672. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/live-drift/case.yaml +0 -0
  673. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/live-drift/fixture/after.json +0 -0
  674. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/live-drift/fixture/before.json +0 -0
  675. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/live-incident/case.yaml +0 -0
  676. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/live-incident/fixture/changes.json +0 -0
  677. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/live-incident/fixture/incident.json +0 -0
  678. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/live-k8s-collect/case.yaml +0 -0
  679. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/live-k8s-collect/fixture/kubectl/get_configmaps.denied.txt +0 -0
  680. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/live-k8s-collect/fixture/kubectl/get_deployments.apps.json +0 -0
  681. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/live-k8s-collect/fixture/kubectl/get_pods.json +0 -0
  682. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/live-k8s-collect/fixture/kubectl/get_secrets.json +0 -0
  683. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/live-multicluster/case.yaml +0 -0
  684. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/live-multicluster/fixture/clusters.json +0 -0
  685. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/live-plan/case.yaml +0 -0
  686. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/live-plan/fixture/drift.json +0 -0
  687. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/live-reconcile/case.yaml +0 -0
  688. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/live-reconcile/fixture/desired.json +0 -0
  689. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/live-reconcile/fixture/observed.json +0 -0
  690. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/live-secrets-boundary/case.yaml +0 -0
  691. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/live-secrets-boundary/fixture/envelope.json +0 -0
  692. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/live-temporal-graph/case.yaml +0 -0
  693. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/live-temporal-graph/fixture/graph.json +0 -0
  694. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/ops-approval/case.yaml +0 -0
  695. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/ops-convergence/case.yaml +0 -0
  696. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/ops-execution-safety/case.yaml +0 -0
  697. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/ops-intent/case.yaml +0 -0
  698. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/ops-planning/case.yaml +0 -0
  699. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/ops-policy/case.yaml +0 -0
  700. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/ops-rollback/case.yaml +0 -0
  701. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/ops-verification/case.yaml +0 -0
  702. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/rollback-argocd-revision/case.yaml +0 -0
  703. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/rollback-blind-inverse/case.yaml +0 -0
  704. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/rollback-git-commit/case.yaml +0 -0
  705. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/rollback-impossible/case.yaml +0 -0
  706. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/rollback-k8s-annotation-restore/case.yaml +0 -0
  707. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/rollback-k8s-scale/case.yaml +0 -0
  708. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/rollback-material-tamper/case.yaml +0 -0
  709. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/rollback-terraform-replan/case.yaml +0 -0
  710. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/rollback-unknown/case.yaml +0 -0
  711. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/routing-specialist/case.yaml +0 -0
  712. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/rtk-roundtrip/case.yaml +0 -0
  713. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/rtk-roundtrip/fixture/verbose.txt +0 -0
  714. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/sbom-vuln/case.yaml +0 -0
  715. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/sbom-vuln/fixture/sbom.json +0 -0
  716. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/secret-prose-mixed/fixture/app.env +0 -0
  717. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/secret-prose-mixed/fixture/policy-notes.md +0 -0
  718. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/secrets-noleak/case.yaml +0 -0
  719. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/secrets-noleak/fixture/app.env +0 -0
  720. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/slo-fastburn/case.yaml +0 -0
  721. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/slo-fastburn/fixture/events.yaml +0 -0
  722. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/slo-fastburn/fixture/slo.yaml +0 -0
  723. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/slo-noinput/case.yaml +0 -0
  724. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/slo-noinput/fixture/events.yaml +0 -0
  725. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/slo-noinput/fixture/slo.yaml +0 -0
  726. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/sot-conflict/case.yaml +0 -0
  727. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/token-budget/case.yaml +0 -0
  728. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/token-budget/fixture/big.py +0 -0
  729. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/xr-delete/case.yaml +0 -0
  730. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/xr-delete/fixture/xr.yaml +0 -0
  731. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/xr-graph-chain/case.yaml +0 -0
  732. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/xr-graph-chain/fixture/xrd.yaml +0 -0
  733. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/xr-negative-crd/case.yaml +0 -0
  734. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/xr-negative-crd/fixture/widget.yaml +0 -0
  735. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/xr-upbound-mr/case.yaml +0 -0
  736. {platformforge-0.2.1 → platformforge-0.2.2}/evals/cases/xr-upbound-mr/fixture/bucket.yaml +0 -0
  737. {platformforge-0.2.1 → platformforge-0.2.2}/evals/qpt-bench/change-review/case.yaml +0 -0
  738. {platformforge-0.2.1 → platformforge-0.2.2}/evals/qpt-bench/change-review/fixture/plan.json +0 -0
  739. {platformforge-0.2.1 → platformforge-0.2.2}/evals/qpt-bench/gha-security/case.yaml +0 -0
  740. {platformforge-0.2.1 → platformforge-0.2.2}/evals/qpt-bench/gha-security/fixture/ci.yml +0 -0
  741. {platformforge-0.2.1 → platformforge-0.2.2}/evals/qpt-bench/iam-investigate/case.yaml +0 -0
  742. {platformforge-0.2.1 → platformforge-0.2.2}/evals/qpt-bench/iam-investigate/fixture/policy.json +0 -0
  743. {platformforge-0.2.1 → platformforge-0.2.2}/evals/qpt-bench/incident-analysis/case.yaml +0 -0
  744. {platformforge-0.2.1 → platformforge-0.2.2}/evals/qpt-bench/incident-analysis/fixture/query.json +0 -0
  745. {platformforge-0.2.1 → platformforge-0.2.2}/evals/qpt-bench/incident-analysis/fixture/rules.yaml +0 -0
  746. {platformforge-0.2.1 → platformforge-0.2.2}/evals/qpt-bench/k8s-review/case.yaml +0 -0
  747. {platformforge-0.2.1 → platformforge-0.2.2}/evals/qpt-bench/k8s-review/fixture/deploy.yaml +0 -0
  748. {platformforge-0.2.1 → platformforge-0.2.2}/evals/qpt-bench/tf-security/case.yaml +0 -0
  749. {platformforge-0.2.1 → platformforge-0.2.2}/evals/qpt-bench/tf-security/fixture/main.tf +0 -0
  750. {platformforge-0.2.1 → platformforge-0.2.2}/factory/specs/archive/2026/cyc9-07-scenarios-platform.md +0 -0
  751. {platformforge-0.2.1 → platformforge-0.2.2}/forge.agentic.json +0 -0
  752. {platformforge-0.2.1 → platformforge-0.2.2}/forge.json +0 -0
  753. {platformforge-0.2.1 → platformforge-0.2.2}/install.ps1 +0 -0
  754. {platformforge-0.2.1 → platformforge-0.2.2}/install.sh +0 -0
  755. {platformforge-0.2.1 → platformforge-0.2.2}/install.windows.sh +0 -0
  756. {platformforge-0.2.1 → platformforge-0.2.2}/knowledge/aws/eks.yaml +0 -0
  757. {platformforge-0.2.1 → platformforge-0.2.2}/knowledge/aws/iam.yaml +0 -0
  758. {platformforge-0.2.1 → platformforge-0.2.2}/knowledge/aws/network-exposure.yaml +0 -0
  759. {platformforge-0.2.1 → platformforge-0.2.2}/knowledge/aws/organizations.yaml +0 -0
  760. {platformforge-0.2.1 → platformforge-0.2.2}/knowledge/crossplane/composition-providers.yaml +0 -0
  761. {platformforge-0.2.1 → platformforge-0.2.2}/knowledge/crossplane/managed-resources.yaml +0 -0
  762. {platformforge-0.2.1 → platformforge-0.2.2}/knowledge/crossplane/v1-v2.yaml +0 -0
  763. {platformforge-0.2.1 → platformforge-0.2.2}/knowledge/kubernetes/api-deprecations.yaml +0 -0
  764. {platformforge-0.2.1 → platformforge-0.2.2}/knowledge/kubernetes/autoscaling-rbac.yaml +0 -0
  765. {platformforge-0.2.1 → platformforge-0.2.2}/knowledge/kubernetes/gateway-api.yaml +0 -0
  766. {platformforge-0.2.1 → platformforge-0.2.2}/knowledge/kubernetes/pod-security.yaml +0 -0
  767. {platformforge-0.2.1 → platformforge-0.2.2}/knowledge/sources.yaml +0 -0
  768. {platformforge-0.2.1 → platformforge-0.2.2}/knowledge/terraform/lifecycle.yaml +0 -0
  769. {platformforge-0.2.1 → platformforge-0.2.2}/knowledge/terraform/plan-semantics.yaml +0 -0
  770. {platformforge-0.2.1 → platformforge-0.2.2}/lab/chaos-pod-kill/chaos.yaml +0 -0
  771. {platformforge-0.2.1 → platformforge-0.2.2}/lab/chaos-pod-kill/facts.json +0 -0
  772. {platformforge-0.2.1 → platformforge-0.2.2}/lab/fleets/acme/capacity.yaml +0 -0
  773. {platformforge-0.2.1 → platformforge-0.2.2}/lab/fleets/acme/costs.yaml +0 -0
  774. {platformforge-0.2.1 → platformforge-0.2.2}/lab/fleets/acme/events.yaml +0 -0
  775. {platformforge-0.2.1 → platformforge-0.2.2}/lab/fleets/acme/fleet.yaml +0 -0
  776. {platformforge-0.2.1 → platformforge-0.2.2}/lab/fleets/acme/graph.yaml +0 -0
  777. {platformforge-0.2.1 → platformforge-0.2.2}/lab/fleets/acme/policies.yaml +0 -0
  778. {platformforge-0.2.1 → platformforge-0.2.2}/lab/fleets/acme/requests.yaml +0 -0
  779. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/argo-bad-rollout/expected.yaml +0 -0
  780. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/argo-bad-rollout/fixture/app.yaml +0 -0
  781. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/aws-dump/expected.yaml +0 -0
  782. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/aws-dump/fixture/compute.json +0 -0
  783. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/aws-dump/fixture/iam.json +0 -0
  784. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/aws-dump/fixture/network.json +0 -0
  785. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/aws-dump/fixture/org.json +0 -0
  786. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/aws-dump/fixture/storage.json +0 -0
  787. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/container-unsigned/expected.yaml +0 -0
  788. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/container-unsigned/fixture/supply.json +0 -0
  789. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/cost-idle-workload/expected.yaml +0 -0
  790. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/cost-idle-workload/fixture/costs.json +0 -0
  791. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/crossplane-platform/expected.yaml +0 -0
  792. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/crossplane-platform/fixture/negative.yaml +0 -0
  793. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/crossplane-platform/fixture/xrd.yaml +0 -0
  794. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/demo-platform/expected.yaml +0 -0
  795. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/demo-platform/fixture/.github/workflows/ci.yml +0 -0
  796. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/demo-platform/fixture/deploy.yaml +0 -0
  797. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/demo-platform/fixture/infra.tf +0 -0
  798. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/fleet-ai/expected.yaml +0 -0
  799. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/fleet-capacity/expected.yaml +0 -0
  800. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/fleet-cost/expected.yaml +0 -0
  801. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/fleet-federation/expected.yaml +0 -0
  802. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/fleet-golden-path/expected.yaml +0 -0
  803. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/fleet-op-hotspot/expected.yaml +0 -0
  804. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/fleet-ownership/expected.yaml +0 -0
  805. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/fleet-partial/expected.yaml +0 -0
  806. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/fleet-policy-friction/expected.yaml +0 -0
  807. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/fleet-recurring-incident/expected.yaml +0 -0
  808. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/fleet-report/expected.yaml +0 -0
  809. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/fleet-risk/expected.yaml +0 -0
  810. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/gitops-drift/expected.yaml +0 -0
  811. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/gitops-drift/fixture/app.yaml +0 -0
  812. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/k8s-bad-readiness/expected.yaml +0 -0
  813. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/k8s-bad-readiness/fixture/deploy.yaml +0 -0
  814. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/k8s-bad-readiness/fixture/netpol.yaml +0 -0
  815. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/k8s-missing-limits/expected.yaml +0 -0
  816. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/k8s-missing-limits/fixture/deploy.yaml +0 -0
  817. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/k8s-missing-limits/fixture/netpol.yaml +0 -0
  818. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/k8s-single-replica/expected.yaml +0 -0
  819. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/k8s-single-replica/fixture/deploy.yaml +0 -0
  820. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/k8s-single-replica/fixture/netpol.yaml +0 -0
  821. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/live-aws-collect/expected.yaml +0 -0
  822. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/live-aws-collect/fixture/aws/ec2_describe-vpcs.json +0 -0
  823. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/live-aws-collect/fixture/aws/iam_list-users.denied.txt +0 -0
  824. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/live-aws-collect/fixture/aws/sts_get-caller-identity.json +0 -0
  825. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/live-k8s-collect/expected.yaml +0 -0
  826. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/live-k8s-collect/fixture/kubectl/get_configmaps.denied.txt +0 -0
  827. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/live-k8s-collect/fixture/kubectl/get_deployments.apps.json +0 -0
  828. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/live-k8s-collect/fixture/kubectl/get_pods.json +0 -0
  829. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/live-k8s-collect/fixture/kubectl/get_secrets.json +0 -0
  830. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/live-kind/expected.yaml +0 -0
  831. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/live-kind/fixture/kubectl/get_configmaps.denied.txt +0 -0
  832. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/live-kind/fixture/kubectl/get_deployments.apps.json +0 -0
  833. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/live-kind/fixture/kubectl/get_pods.json +0 -0
  834. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/live-kind/fixture/kubectl/get_secrets.json +0 -0
  835. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/network-policy-missing/expected.yaml +0 -0
  836. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/network-policy-missing/fixture/deploy.yaml +0 -0
  837. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/ops-bad-rollout/expected.yaml +0 -0
  838. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/ops-bad-rollout/fixture/ops.yaml +0 -0
  839. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/ops-break-glass/expected.yaml +0 -0
  840. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/ops-break-glass/fixture/ops.yaml +0 -0
  841. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/ops-broken-selector/expected.yaml +0 -0
  842. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/ops-broken-selector/fixture/ops.yaml +0 -0
  843. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/ops-changed-plan-hash/expected.yaml +0 -0
  844. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/ops-changed-plan-hash/fixture/ops.yaml +0 -0
  845. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/ops-conflicting-operation/expected.yaml +0 -0
  846. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/ops-conflicting-operation/fixture/ops.yaml +0 -0
  847. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/ops-expired-approval/expected.yaml +0 -0
  848. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/ops-expired-approval/fixture/ops.yaml +0 -0
  849. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/ops-partial-failure/expected.yaml +0 -0
  850. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/ops-partial-failure/fixture/ops.yaml +0 -0
  851. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/ops-policy-denial/expected.yaml +0 -0
  852. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/ops-policy-denial/fixture/ops.yaml +0 -0
  853. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/ops-replica-drift/expected.yaml +0 -0
  854. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/ops-replica-drift/fixture/ops.yaml +0 -0
  855. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/ops-rollback-annotate/expected.yaml +0 -0
  856. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/ops-rollback-annotate/fixture/ops.yaml +0 -0
  857. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/ops-rollback-gitops/expected.yaml +0 -0
  858. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/ops-rollback-gitops/fixture/ops.yaml +0 -0
  859. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/ops-rollback-impossible/expected.yaml +0 -0
  860. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/ops-rollback-impossible/fixture/ops.yaml +0 -0
  861. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/ops-rollback-scale/expected.yaml +0 -0
  862. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/ops-rollback-scale/fixture/ops.yaml +0 -0
  863. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/ops-rollback-terraform/expected.yaml +0 -0
  864. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/ops-rollback-terraform/fixture/ops.yaml +0 -0
  865. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/ops-rollback-terraform/fixture/tf/tfplan.bin +0 -0
  866. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/ops-stale-observation/expected.yaml +0 -0
  867. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/ops-stale-observation/fixture/ops.yaml +0 -0
  868. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/secret-exposure/expected.yaml +0 -0
  869. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/secret-exposure/fixture/app.env +0 -0
  870. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/slo-burn/expected.yaml +0 -0
  871. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/slo-burn/fixture/events.yaml +0 -0
  872. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/slo-burn/fixture/slo.yaml +0 -0
  873. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/terraform-iam-wildcard/expected.yaml +0 -0
  874. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/terraform-iam-wildcard/fixture/policy.json +0 -0
  875. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/terraform-public-bucket/expected.yaml +0 -0
  876. {platformforge-0.2.1 → platformforge-0.2.2}/lab/scenarios/terraform-public-bucket/fixture/main.tf +0 -0
  877. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/__main__.py +0 -0
  878. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/_forge_portal.py +0 -0
  879. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/_graphstudio.py +0 -0
  880. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/_graphview.py +0 -0
  881. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/_portal_telemetry.py +0 -0
  882. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/agents/__init__.py +0 -0
  883. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/agents/bench.py +0 -0
  884. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/agents/contextpack.py +0 -0
  885. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/agents/contracts.py +0 -0
  886. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/agents/coordinators.py +0 -0
  887. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/agents/critic.py +0 -0
  888. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/agents/debate.py +0 -0
  889. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/agents/executors.py +0 -0
  890. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/agents/guardian.py +0 -0
  891. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/agents/mirrors.py +0 -0
  892. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/agents/orchestrator.py +0 -0
  893. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/agents/planner.py +0 -0
  894. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/agents/playbook.py +0 -0
  895. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/agents/referee.py +0 -0
  896. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/agents/reviewers.py +0 -0
  897. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/agents/roster.py +0 -0
  898. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/agents/runledger.py +0 -0
  899. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/agents/runstore.py +0 -0
  900. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/agents/specialists.py +0 -0
  901. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/agents/taskspec.py +0 -0
  902. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/agents/uniqueness.py +0 -0
  903. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/agents/verifier.py +0 -0
  904. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/aiplat/__init__.py +0 -0
  905. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/aiplat/models.py +0 -0
  906. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/analytics/__init__.py +0 -0
  907. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/analytics/capacity.py +0 -0
  908. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/analytics/debt.py +0 -0
  909. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/analytics/dx.py +0 -0
  910. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/analytics/finops_v4.py +0 -0
  911. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/analytics/goldenpath.py +0 -0
  912. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/analytics/history.py +0 -0
  913. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/analytics/measurement.py +0 -0
  914. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/analytics/models.py +0 -0
  915. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/analytics/opsanalytics.py +0 -0
  916. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/analytics/policyintel.py +0 -0
  917. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/analytics/reliability.py +0 -0
  918. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/analytics/soak.py +0 -0
  919. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/analytics/store.py +0 -0
  920. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/bench.py +0 -0
  921. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/cases/__init__.py +0 -0
  922. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/cases/casefile.py +0 -0
  923. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/cases/context_audit.py +0 -0
  924. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/cases/ledgers.py +0 -0
  925. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/cases/replay.py +0 -0
  926. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/cases/routing_audit.py +0 -0
  927. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/caveman/__init__.py +0 -0
  928. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/caveman/compress.py +0 -0
  929. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/cicd/__init__.py +0 -0
  930. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/cicd/backstage.py +0 -0
  931. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/cicd/dockerfile.py +0 -0
  932. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/cicd/github_actions.py +0 -0
  933. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/cicd/gitlab_ci.py +0 -0
  934. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/cicd/gitops.py +0 -0
  935. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/cli/__init__.py +0 -0
  936. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/cli/fleetcmd.py +0 -0
  937. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/cli/main.py +0 -0
  938. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/cloud/__init__.py +0 -0
  939. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/cloud/aws.py +0 -0
  940. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/cloud/common.py +0 -0
  941. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/cloud/multicloud.py +0 -0
  942. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/collect/__init__.py +0 -0
  943. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/collect/detect.py +0 -0
  944. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/context/__init__.py +0 -0
  945. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/context/capsule.py +0 -0
  946. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/context/gateway.py +0 -0
  947. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/context/refs.py +0 -0
  948. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/context/sufficiency.py +0 -0
  949. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/core/__init__.py +0 -0
  950. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/core/hashing.py +0 -0
  951. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/core/ownership.py +0 -0
  952. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/core/receipts.py +0 -0
  953. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/core/redaction.py +0 -0
  954. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/core/store.py +0 -0
  955. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/core/workspace.py +0 -0
  956. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/data/portable_skills/platformforge-agents/SKILL.md +0 -0
  957. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/data/portable_skills/platformforge-change/SKILL.md +0 -0
  958. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/data/portable_skills/platformforge-core/SKILL.md +0 -0
  959. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/data/portable_skills/platformforge-economy/SKILL.md +0 -0
  960. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/data/portable_skills/platformforge-finops/SKILL.md +0 -0
  961. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/data/portable_skills/platformforge-fleet/SKILL.md +0 -0
  962. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/data/portable_skills/platformforge-governance/SKILL.md +0 -0
  963. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/data/portable_skills/platformforge-graph/SKILL.md +0 -0
  964. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/data/portable_skills/platformforge-lab/SKILL.md +0 -0
  965. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/data/portable_skills/platformforge-sdd/SKILL.md +0 -0
  966. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/data/portable_skills/platformforge-security/SKILL.md +0 -0
  967. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/data/portable_skills/platformforge-sre/SKILL.md +0 -0
  968. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/diagnose/__init__.py +0 -0
  969. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/discovery.py +0 -0
  970. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/discovery_ops.py +0 -0
  971. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/distribution/__init__.py +0 -0
  972. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/distribution/bundle.py +0 -0
  973. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/distribution/hostflow.py +0 -0
  974. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/distribution/models.py +0 -0
  975. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/distribution/service.py +0 -0
  976. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/economy/__init__.py +0 -0
  977. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/economy/bench.py +0 -0
  978. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/economy/budget.py +0 -0
  979. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/economy/cache.py +0 -0
  980. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/economy/checkpoint.py +0 -0
  981. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/economy/collection.py +0 -0
  982. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/economy/doctor.py +0 -0
  983. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/economy/engine.py +0 -0
  984. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/economy/envelope.py +0 -0
  985. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/economy/fleetpack.py +0 -0
  986. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/economy/ledger.py +0 -0
  987. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/economy/plan.py +0 -0
  988. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/economy/pricing.py +0 -0
  989. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/economy/qpt.py +0 -0
  990. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/economy/reconcile.py +0 -0
  991. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/economy/verifyplan.py +0 -0
  992. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/economy/waste.py +0 -0
  993. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/evals/__init__.py +0 -0
  994. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/evals/coverage.py +0 -0
  995. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/evals/fleet_invariants.py +0 -0
  996. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/evals/ops_invariants.py +0 -0
  997. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/evals/runner.py +0 -0
  998. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/evals/surface.py +0 -0
  999. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/evals/taxonomy.py +0 -0
  1000. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/federation/__init__.py +0 -0
  1001. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/federation/node.py +0 -0
  1002. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/finops/__init__.py +0 -0
  1003. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/finops/alloc.py +0 -0
  1004. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/finops/costs.py +0 -0
  1005. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/finops/focus.py +0 -0
  1006. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/finops/graph_cost.py +0 -0
  1007. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/finops/ingest.py +0 -0
  1008. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/finops/insights.py +0 -0
  1009. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/finops/unit.py +0 -0
  1010. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/fleet/__init__.py +0 -0
  1011. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/fleet/loader.py +0 -0
  1012. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/fleet/models.py +0 -0
  1013. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/fleet/orggraph.py +0 -0
  1014. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/fleet/query.py +0 -0
  1015. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/forge/__init__.py +0 -0
  1016. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/forge/collect.py +0 -0
  1017. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/forge/delegate.py +0 -0
  1018. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/forge/manifest.py +0 -0
  1019. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/freeze/__init__.py +0 -0
  1020. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/freeze/exceptions.py +0 -0
  1021. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/freeze/manifest.py +0 -0
  1022. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/freeze/snapshots.py +0 -0
  1023. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/graph/__init__.py +0 -0
  1024. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/graph/backend.py +0 -0
  1025. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/graph/bench.py +0 -0
  1026. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/graph/build.py +0 -0
  1027. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/graph/delivery.py +0 -0
  1028. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/graph/diff.py +0 -0
  1029. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/graph/events.py +0 -0
  1030. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/graph/migrate.py +0 -0
  1031. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/graph/model.py +0 -0
  1032. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/graph/persist.py +0 -0
  1033. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/graph/query.py +0 -0
  1034. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/graph/temporal.py +0 -0
  1035. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/graph/vocab.py +0 -0
  1036. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/graphview.py +0 -0
  1037. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/iac/__init__.py +0 -0
  1038. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/iac/drift.py +0 -0
  1039. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/iac/plan.py +0 -0
  1040. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/iac/terraform.py +0 -0
  1041. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/install/__init__.py +0 -0
  1042. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/k8s/__init__.py +0 -0
  1043. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/k8s/helm.py +0 -0
  1044. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/k8s/hubble.py +0 -0
  1045. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/k8s/manifests.py +0 -0
  1046. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/knowledge/__init__.py +0 -0
  1047. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/knowledge/packs.py +0 -0
  1048. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/knowledge/registry.py +0 -0
  1049. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/knowledge/select.py +0 -0
  1050. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/lab/__init__.py +0 -0
  1051. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/lab/chaos.py +0 -0
  1052. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/lab/fleetlab.py +0 -0
  1053. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/lab/opslab.py +0 -0
  1054. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/lab/runner.py +0 -0
  1055. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/live/__init__.py +0 -0
  1056. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/live/budget.py +0 -0
  1057. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/live/capability.py +0 -0
  1058. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/live/collectors/__init__.py +0 -0
  1059. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/live/collectors/aws.py +0 -0
  1060. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/live/collectors/aws_transport.py +0 -0
  1061. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/live/collectors/k8s.py +0 -0
  1062. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/live/collectors/k8s_transport.py +0 -0
  1063. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/live/cursors.py +0 -0
  1064. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/live/drift.py +0 -0
  1065. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/live/envelope.py +0 -0
  1066. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/live/federation.py +0 -0
  1067. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/live/fixtures.py +0 -0
  1068. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/live/identity.py +0 -0
  1069. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/live/incident.py +0 -0
  1070. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/live/models.py +0 -0
  1071. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/live/reconcile.py +0 -0
  1072. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/live/remediate.py +0 -0
  1073. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/live/store.py +0 -0
  1074. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/live/topology.py +0 -0
  1075. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/mcp/__init__.py +0 -0
  1076. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/mcp/parity.py +0 -0
  1077. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/mcp/registry.py +0 -0
  1078. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/mcp/server.py +0 -0
  1079. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/mcp/tools.py +0 -0
  1080. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/models/__init__.py +0 -0
  1081. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/models/base.py +0 -0
  1082. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/observe/__init__.py +0 -0
  1083. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/observe/capacity.py +0 -0
  1084. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/observe/dr.py +0 -0
  1085. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/observe/grafana.py +0 -0
  1086. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/observe/incident.py +0 -0
  1087. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/observe/otel.py +0 -0
  1088. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/observe/postmortem.py +0 -0
  1089. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/observe/prometheus.py +0 -0
  1090. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/observe/slo.py +0 -0
  1091. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/ops/__init__.py +0 -0
  1092. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/ops/actions.py +0 -0
  1093. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/ops/analytics.py +0 -0
  1094. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/ops/approval.py +0 -0
  1095. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/ops/autorem.py +0 -0
  1096. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/ops/config.py +0 -0
  1097. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/ops/engine.py +0 -0
  1098. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/ops/envelope.py +0 -0
  1099. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/ops/executors/__init__.py +0 -0
  1100. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/ops/executors/base.py +0 -0
  1101. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/ops/executors/git.py +0 -0
  1102. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/ops/executors/gitops.py +0 -0
  1103. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/ops/executors/terraform.py +0 -0
  1104. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/ops/gates.py +0 -0
  1105. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/ops/goldenpath.py +0 -0
  1106. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/ops/material.py +0 -0
  1107. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/ops/models.py +0 -0
  1108. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/ops/operation.py +0 -0
  1109. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/ops/opgraph.py +0 -0
  1110. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/ops/policy.py +0 -0
  1111. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/ops/preconditions.py +0 -0
  1112. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/ops/registry.py +0 -0
  1113. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/ops/risk.py +0 -0
  1114. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/ops/rollback.py +0 -0
  1115. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/ops/rollback_builders.py +0 -0
  1116. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/ops/runbook.py +0 -0
  1117. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/ops/simulate.py +0 -0
  1118. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/ops/source_of_truth.py +0 -0
  1119. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/ops/store.py +0 -0
  1120. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/ops/verify.py +0 -0
  1121. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/optimize/__init__.py +0 -0
  1122. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/optimize/engine.py +0 -0
  1123. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/optimize/models.py +0 -0
  1124. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/optimize/scan.py +0 -0
  1125. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/plan/__init__.py +0 -0
  1126. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/portable_cli.py +0 -0
  1127. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/portal_adapter.py +0 -0
  1128. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/product/__init__.py +0 -0
  1129. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/product/backstage.py +0 -0
  1130. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/product/catalog.py +0 -0
  1131. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/product/crossplane.py +0 -0
  1132. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/product/golden_paths/__init__.py +0 -0
  1133. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/product/golden_paths/engine.py +0 -0
  1134. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/product/golden_paths/library.yaml +0 -0
  1135. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/product/golden_paths/model.py +0 -0
  1136. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/product/maturity.py +0 -0
  1137. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/product/scorecards.py +0 -0
  1138. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/resources.py +0 -0
  1139. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/risk/__init__.py +0 -0
  1140. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/risk/engine.py +0 -0
  1141. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/risk/signals.py +0 -0
  1142. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/routing/__init__.py +0 -0
  1143. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/routing/decision.py +0 -0
  1144. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/routing/router.py +0 -0
  1145. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/rtk/__init__.py +0 -0
  1146. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/rtk/compact.py +0 -0
  1147. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/rtk/parsers.py +0 -0
  1148. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/rules/__init__.py +0 -0
  1149. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/rules/engine.py +0 -0
  1150. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/sandbox/__init__.py +0 -0
  1151. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/sandbox/env.py +0 -0
  1152. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/sandbox/review.py +0 -0
  1153. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/sdd/__init__.py +0 -0
  1154. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/sdd/lifecycle.py +0 -0
  1155. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/security/__init__.py +0 -0
  1156. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/security/cosign.py +0 -0
  1157. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/security/iam.py +0 -0
  1158. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/security/identity.py +0 -0
  1159. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/security/kyverno.py +0 -0
  1160. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/security/sbom.py +0 -0
  1161. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/security/scan.py +0 -0
  1162. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/security/slsa.py +0 -0
  1163. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/security/supply.py +0 -0
  1164. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/tokensave/__init__.py +0 -0
  1165. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/tokensave/budget.py +0 -0
  1166. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/tokensave/estimate.py +0 -0
  1167. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/tokensave/index.py +0 -0
  1168. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/tokensave/ledger.py +0 -0
  1169. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/tokensave/packs.py +0 -0
  1170. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/ui/__init__.py +0 -0
  1171. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/ui/app.py +0 -0
  1172. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/ui/home.py +0 -0
  1173. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/ui/i18n.py +0 -0
  1174. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/ui/kit.py +0 -0
  1175. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/ui/screen.py +0 -0
  1176. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/ui/tui.py +0 -0
  1177. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/ui/wizard.py +0 -0
  1178. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/workspace/__init__.py +0 -0
  1179. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/workspace/models.py +0 -0
  1180. {platformforge-0.2.1 → platformforge-0.2.2}/platformforge/workspace/service.py +0 -0
  1181. {platformforge-0.2.1 → platformforge-0.2.2}/portal/assets/chunk-6_bITucK.js +0 -0
  1182. {platformforge-0.2.1 → platformforge-0.2.2}/portal/assets/chunk-B5AB8czV.js +0 -0
  1183. {platformforge-0.2.1 → platformforge-0.2.2}/portal/assets/chunk-BJbNCJrv.js +0 -0
  1184. {platformforge-0.2.1 → platformforge-0.2.2}/portal/assets/chunk-BWjIRvH1.js +0 -0
  1185. {platformforge-0.2.1 → platformforge-0.2.2}/portal/assets/chunk-BXk7RxGM.js +0 -0
  1186. {platformforge-0.2.1 → platformforge-0.2.2}/portal/assets/chunk-BYYLUO5t.js +0 -0
  1187. {platformforge-0.2.1 → platformforge-0.2.2}/portal/assets/chunk-BYc3t4cg.js +0 -0
  1188. {platformforge-0.2.1 → platformforge-0.2.2}/portal/assets/chunk-BglFR9Wn.js +0 -0
  1189. {platformforge-0.2.1 → platformforge-0.2.2}/portal/assets/chunk-Bj5_93Ey.js +0 -0
  1190. {platformforge-0.2.1 → platformforge-0.2.2}/portal/assets/chunk-Bkokxnl9.js +0 -0
  1191. {platformforge-0.2.1 → platformforge-0.2.2}/portal/assets/chunk-BnZq9uBz.js +0 -0
  1192. {platformforge-0.2.1 → platformforge-0.2.2}/portal/assets/chunk-BpIbIo4H.js +0 -0
  1193. {platformforge-0.2.1 → platformforge-0.2.2}/portal/assets/chunk-C-R9EDEw.js +0 -0
  1194. {platformforge-0.2.1 → platformforge-0.2.2}/portal/assets/chunk-C0nXO1-7.js +0 -0
  1195. {platformforge-0.2.1 → platformforge-0.2.2}/portal/assets/chunk-C1jICkBx.js +0 -0
  1196. {platformforge-0.2.1 → platformforge-0.2.2}/portal/assets/chunk-C2Vik-mF.js +0 -0
  1197. {platformforge-0.2.1 → platformforge-0.2.2}/portal/assets/chunk-C6ri1BES.js +0 -0
  1198. {platformforge-0.2.1 → platformforge-0.2.2}/portal/assets/chunk-C8bgMzTS.js +0 -0
  1199. {platformforge-0.2.1 → platformforge-0.2.2}/portal/assets/chunk-CV7TSqiz.js +0 -0
  1200. {platformforge-0.2.1 → platformforge-0.2.2}/portal/assets/chunk-CWCQmMmw.js +0 -0
  1201. {platformforge-0.2.1 → platformforge-0.2.2}/portal/assets/chunk-CZreZLNQ.js +0 -0
  1202. {platformforge-0.2.1 → platformforge-0.2.2}/portal/assets/chunk-CaHx1phd.js +0 -0
  1203. {platformforge-0.2.1 → platformforge-0.2.2}/portal/assets/chunk-Cp1ysZIS.js +0 -0
  1204. {platformforge-0.2.1 → platformforge-0.2.2}/portal/assets/chunk-CzfElE0B.js +0 -0
  1205. {platformforge-0.2.1 → platformforge-0.2.2}/portal/assets/chunk-D-7Jr8A3.js +0 -0
  1206. {platformforge-0.2.1 → platformforge-0.2.2}/portal/assets/chunk-D-GKcz1x.js +0 -0
  1207. {platformforge-0.2.1 → platformforge-0.2.2}/portal/assets/chunk-D0sdF23X.js +0 -0
  1208. {platformforge-0.2.1 → platformforge-0.2.2}/portal/assets/chunk-D4e-ThVc.js +0 -0
  1209. {platformforge-0.2.1 → platformforge-0.2.2}/portal/assets/chunk-DAuZ25Se.js +0 -0
  1210. {platformforge-0.2.1 → platformforge-0.2.2}/portal/assets/chunk-DNdMiBOi.js +0 -0
  1211. {platformforge-0.2.1 → platformforge-0.2.2}/portal/assets/chunk-Df-i8acd.js +0 -0
  1212. {platformforge-0.2.1 → platformforge-0.2.2}/portal/assets/chunk-DiTrvQme.js +0 -0
  1213. {platformforge-0.2.1 → platformforge-0.2.2}/portal/assets/chunk-DuZy_X7l.js +0 -0
  1214. {platformforge-0.2.1 → platformforge-0.2.2}/portal/assets/chunk-E37BkvkU.js +0 -0
  1215. {platformforge-0.2.1 → platformforge-0.2.2}/portal/assets/chunk-RSTfWegd.js +0 -0
  1216. {platformforge-0.2.1 → platformforge-0.2.2}/portal/assets/chunk-SeIyT7eK.js +0 -0
  1217. {platformforge-0.2.1 → platformforge-0.2.2}/portal/assets/chunk-Wd_5yY1t.js +0 -0
  1218. {platformforge-0.2.1 → platformforge-0.2.2}/portal/assets/chunk-mfSjBx6W.js +0 -0
  1219. {platformforge-0.2.1 → platformforge-0.2.2}/portal/assets/chunk-tc9WQav2.js +0 -0
  1220. {platformforge-0.2.1 → platformforge-0.2.2}/portal/assets/chunk-vIImL6Fw.js +0 -0
  1221. {platformforge-0.2.1 → platformforge-0.2.2}/portal/assets/chunk-yM6DMc_W.js +0 -0
  1222. {platformforge-0.2.1 → platformforge-0.2.2}/portal/assets/chunk-yaTNqnhj.js +0 -0
  1223. {platformforge-0.2.1 → platformforge-0.2.2}/portal/assets/favicon.ico +0 -0
  1224. {platformforge-0.2.1 → platformforge-0.2.2}/portal/assets/index.html +0 -0
  1225. {platformforge-0.2.1 → platformforge-0.2.2}/portal/assets/main-YKFPUKID.js +0 -0
  1226. {platformforge-0.2.1 → platformforge-0.2.2}/portal/assets/styles-B6ZRGG3C.css +0 -0
  1227. {platformforge-0.2.1 → platformforge-0.2.2}/portal/manifest.json +0 -0
  1228. {platformforge-0.2.1 → platformforge-0.2.2}/rules/catalog/finops.yaml +0 -0
  1229. {platformforge-0.2.1 → platformforge-0.2.2}/rules/catalog/gitops.yaml +0 -0
  1230. {platformforge-0.2.1 → platformforge-0.2.2}/rules/catalog/iac.yaml +0 -0
  1231. {platformforge-0.2.1 → platformforge-0.2.2}/rules/catalog/k8s.yaml +0 -0
  1232. {platformforge-0.2.1 → platformforge-0.2.2}/rules/catalog/orchestration.yaml +0 -0
  1233. {platformforge-0.2.1 → platformforge-0.2.2}/rules/catalog/product.yaml +0 -0
  1234. {platformforge-0.2.1 → platformforge-0.2.2}/rules/catalog/routing.yaml +0 -0
  1235. {platformforge-0.2.1 → platformforge-0.2.2}/rules/catalog/security.yaml +0 -0
  1236. {platformforge-0.2.1 → platformforge-0.2.2}/rules/catalog/sre.yaml +0 -0
  1237. {platformforge-0.2.1 → platformforge-0.2.2}/scripts/bench_economy.py +0 -0
  1238. {platformforge-0.2.1 → platformforge-0.2.2}/scripts/docs/check_docs.py +0 -0
  1239. {platformforge-0.2.1 → platformforge-0.2.2}/scripts/docs/doc_catalogs.py +0 -0
  1240. {platformforge-0.2.1 → platformforge-0.2.2}/scripts/docs/doc_index.py +0 -0
  1241. {platformforge-0.2.1 → platformforge-0.2.2}/scripts/docs/doc_inventory.py +0 -0
  1242. {platformforge-0.2.1 → platformforge-0.2.2}/scripts/docs/doc_manifest.py +0 -0
  1243. {platformforge-0.2.1 → platformforge-0.2.2}/scripts/docs/doc_reference.py +0 -0
  1244. {platformforge-0.2.1 → platformforge-0.2.2}/scripts/docs/final_report.py +0 -0
  1245. {platformforge-0.2.1 → platformforge-0.2.2}/scripts/docs/regen_docs.py +0 -0
  1246. {platformforge-0.2.1 → platformforge-0.2.2}/scripts/forge_bootstrap.py +0 -0
  1247. {platformforge-0.2.1 → platformforge-0.2.2}/scripts/freeze_perf_receipt.py +0 -0
  1248. {platformforge-0.2.1 → platformforge-0.2.2}/scripts/freeze_soak_receipt.py +0 -0
  1249. {platformforge-0.2.1 → platformforge-0.2.2}/scripts/freeze_validation_receipt.py +0 -0
  1250. {platformforge-0.2.1 → platformforge-0.2.2}/scripts/gen_cli_surface.py +0 -0
  1251. {platformforge-0.2.1 → platformforge-0.2.2}/scripts/lab/platformforge_lab.py +0 -0
  1252. {platformforge-0.2.1 → platformforge-0.2.2}/scripts/validate.py +0 -0
  1253. {platformforge-0.2.1 → platformforge-0.2.2}/setup.ps1 +0 -0
  1254. {platformforge-0.2.1 → platformforge-0.2.2}/setup.sh +0 -0
  1255. {platformforge-0.2.1 → platformforge-0.2.2}/tests/__init__.py +0 -0
  1256. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_agent_adversarial.py +0 -0
  1257. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_agent_budget.py +0 -0
  1258. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_agent_debate.py +0 -0
  1259. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_agent_economy.py +0 -0
  1260. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_agent_handoffs.py +0 -0
  1261. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_agent_mirrors.py +0 -0
  1262. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_agent_protocol.py +0 -0
  1263. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_agent_routing.py +0 -0
  1264. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_agents.py +0 -0
  1265. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_artifact_contents.py +0 -0
  1266. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_cases.py +0 -0
  1267. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_cicd.py +0 -0
  1268. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_cli_ops.py +0 -0
  1269. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_cloud.py +0 -0
  1270. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_command_rationale.py +0 -0
  1271. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_coordinators.py +0 -0
  1272. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_core.py +0 -0
  1273. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_crossplane.py +0 -0
  1274. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_cycle5_analytics.py +0 -0
  1275. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_cycle5_hardening.py +0 -0
  1276. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_discovery_ops.py +0 -0
  1277. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_doc_drift.py +0 -0
  1278. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_doc_manifest.py +0 -0
  1279. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_docs_drift.py +0 -0
  1280. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_economy.py +0 -0
  1281. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_economy_agents_waste.py +0 -0
  1282. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_economy_cache.py +0 -0
  1283. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_economy_closure.py +0 -0
  1284. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_economy_contracts.py +0 -0
  1285. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_economy_evals.py +0 -0
  1286. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_economy_fleet_qpt.py +0 -0
  1287. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_economy_gateway.py +0 -0
  1288. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_economy_pricing_verify.py +0 -0
  1289. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_economy_v2.py +0 -0
  1290. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_evals_surface.py +0 -0
  1291. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_executors.py +0 -0
  1292. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_federation.py +0 -0
  1293. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_finops.py +0 -0
  1294. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_fleet.py +0 -0
  1295. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_fleet_adversarial.py +0 -0
  1296. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_forge.py +0 -0
  1297. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_freeze.py +0 -0
  1298. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_graph.py +0 -0
  1299. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_graph_v2.py +0 -0
  1300. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_hardening.py +0 -0
  1301. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_hosts_flow.py +0 -0
  1302. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_iac.py +0 -0
  1303. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_install_lifecycle.py +0 -0
  1304. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_k8s.py +0 -0
  1305. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_k8s_depth.py +0 -0
  1306. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_knowledge_packs.py +0 -0
  1307. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_lab.py +0 -0
  1308. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_ledgers.py +0 -0
  1309. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_live_aws.py +0 -0
  1310. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_live_capability.py +0 -0
  1311. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_live_drift.py +0 -0
  1312. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_live_identity.py +0 -0
  1313. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_live_incident.py +0 -0
  1314. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_live_k8s.py +0 -0
  1315. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_live_remediate.py +0 -0
  1316. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_live_security_props.py +0 -0
  1317. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_mcp.py +0 -0
  1318. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_missing_input_refusals.py +0 -0
  1319. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_observation.py +0 -0
  1320. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_observe.py +0 -0
  1321. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_observe_v2.py +0 -0
  1322. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_offline.py +0 -0
  1323. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_ops_adversarial41.py +0 -0
  1324. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_ops_approval.py +0 -0
  1325. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_ops_autorem.py +0 -0
  1326. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_ops_executors.py +0 -0
  1327. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_ops_gapwave.py +0 -0
  1328. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_ops_goldenpath.py +0 -0
  1329. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_ops_hardening.py +0 -0
  1330. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_ops_models.py +0 -0
  1331. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_ops_operation.py +0 -0
  1332. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_ops_opgraph.py +0 -0
  1333. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_ops_pipeline.py +0 -0
  1334. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_ops_policy.py +0 -0
  1335. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_ops_property.py +0 -0
  1336. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_ops_risk.py +0 -0
  1337. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_ops_rollback.py +0 -0
  1338. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_ops_runbook.py +0 -0
  1339. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_ops_runbook41.py +0 -0
  1340. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_ops_verify.py +0 -0
  1341. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_orchestrator.py +0 -0
  1342. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_portable_distribution.py +0 -0
  1343. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_portable_workspace.py +0 -0
  1344. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_portal_adapter.py +0 -0
  1345. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_product.py +0 -0
  1346. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_product_v2.py +0 -0
  1347. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_qpt_v2.py +0 -0
  1348. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_reconcile.py +0 -0
  1349. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_redaction.py +0 -0
  1350. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_reviewers.py +0 -0
  1351. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_routing_audit.py +0 -0
  1352. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_sdd.py +0 -0
  1353. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_security.py +0 -0
  1354. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_soak.py +0 -0
  1355. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_specialists.py +0 -0
  1356. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_surface.py +0 -0
  1357. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_topology.py +0 -0
  1358. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_truth.py +0 -0
  1359. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_ui_resilience.py +0 -0
  1360. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_ui_tui.py +0 -0
  1361. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_wave_h.py +0 -0
  1362. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_wave_k.py +0 -0
  1363. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_wave_l.py +0 -0
  1364. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_wave_n.py +0 -0
  1365. {platformforge-0.2.1 → platformforge-0.2.2}/tests/test_wheel_isolation.py +0 -0
@@ -1,6 +1,20 @@
1
1
  # CHANGELOG
2
2
 
3
3
  All notable changes. Format: wave/feature, the "why", key commits.
4
+ ## [0.2.2] - 2026-10-29
5
+
6
+ ### Fixed
7
+
8
+ - `_forgecontext` v1.3.3 + `_installkit` v1.0.3 (vendored): `repair_context`
9
+ reports malformed capability files per-file instead of crashing;
10
+ context/install locks carry a unique ownership token; poisoned journals
11
+ quarantine instead of wedging later ops; asset/ledger paths are
12
+ validated before disk writes (`FORGE-INSTALL-UNSAFE-PATH`);
13
+ `_atomic_write` preserves file modes.
14
+ - A `BLOCKED` check on the mandatory context-registry component now marks
15
+ the receipt `failed` (nonzero exit) — on install AND on both uninstall
16
+ paths.
17
+
4
18
  ## [0.2.1] - 2026-10-22
5
19
 
6
20
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: platformforge
3
- Version: 0.2.1
3
+ Version: 0.2.2
4
4
  Summary: Agentic Platform Engineering intelligence platform — deterministic, offline-first, evidence-first
5
5
  Project-URL: Homepage, https://github.com/EdgarSocrates98/platform-forge
6
6
  Project-URL: Repository, https://github.com/EdgarSocrates98/platform-forge
@@ -305,3 +305,16 @@ grep -c 'def test_' tests/test_{install_lifecycle,wheel_isolation,
305
305
  | Wheel smoke (venv limpo) | PASS | `pip install platformforge==0.2.0` + `platformforge --version` → `0.2.0` |
306
306
 
307
307
  Notas: installkit canônico 1.0.2 (`_SOURCE_SHA256 a15ca78bb34a0109`), bootstrap 1.1.1 — propagados aos 7 carriers; `vendor.py --check` CLEAN ×7. `data-sentinel-forge`: **deferido pelo dono** (outro CLI evoluindo).
308
+
309
+ ## Pós-release hotfix — evidência de publicação patch (2026-10-23 UTC)
310
+
311
+ Patch motivado pelo review: `UnicodeDecodeError` não-tipado em docs de
312
+ consumidor não-UTF-8 quebrava install **e** uninstall.
313
+
314
+ | Item | Estado | Evidência |
315
+ |---|---|---|
316
+ | Tag | CRIADA | `v0.2.1` |
317
+ | GitHub Release | CRIADO | `gh release view v0.2.1` |
318
+ | PyPI | PUBLICADO | `pypi.org/pypi/platformforge/json` → `0.2.1` |
319
+ | Wheel smoke | PASS | wheel publicado contém `_forgecontext` v1.3.2 (`_read_doc` presente) — verificado via `pip download platformforge==0.2.1` |
320
+ | Regressão | PASS | teste cp1252 `AGENTS.md` → `FORGE-CONTEXT-CONFLICT` nomeado em install e uninstall |
@@ -11,75 +11,75 @@
11
11
  "economy-agentic": {
12
12
  "ok": true,
13
13
  "reproduce": "pytest -q tests/test_economy_agents_waste.py tests/test_economy_evals.py -k uniqueness or debate or duplication or fanout or waste or stagnant",
14
- "seconds": 3.09
14
+ "seconds": 3.31
15
15
  },
16
16
  "economy-budget": {
17
17
  "ok": true,
18
18
  "reproduce": "pytest -q tests/test_economy_contracts.py -k budget or limit or protected or dimension",
19
- "seconds": 2.61
19
+ "seconds": 2.54
20
20
  },
21
21
  "economy-cache": {
22
22
  "ok": true,
23
23
  "reproduce": "pytest -q tests/test_economy_cache.py",
24
- "seconds": 2.72
24
+ "seconds": 12.07
25
25
  },
26
26
  "economy-closure": {
27
27
  "ok": true,
28
28
  "reproduce": "python -c import sys\nfrom pathlib import Path\nreq = {'docs/economy-parity/FINAL-REPORT.md':\n ['validated_sha', 'remote_ci', 'known gap'],\n 'docs/economy-parity/FINAL-MATRIX.md':\n ['validated', 'externally-unverified'],\n 'docs/economy-parity/ECONOMY-BENCHMARKS.md':\n ['Control Plane Overhead', 'End-to-End'],\n 'docs/economy/ROUTING.md':\n ['decide', 'advisory'],\n 'docs/economy-parity/POLISH-BASELINE.md': ['drift']}\nbad = []\nfor f, needles in req.items():\n p = Path(f)\n if not p.is_file(): bad.append(('missing', f)); continue\n txt = p.read_text()\n for n in needles:\n if n not in txt: bad.append((f, n))\nm = Path('docs/economy-parity/FINAL-MATRIX.md').read_text()\nif '\\n' + '|' in m and ' fully-production' in m:\n bad.append(('matrix', 'overclaimed status'))\nif bad: print(bad); sys.exit(1)\nprint('closure docs coherent')\n && pytest -q tests/test_economy_closure.py",
29
- "seconds": 3.56
29
+ "seconds": 3.49
30
30
  },
31
31
  "economy-context": {
32
32
  "ok": true,
33
33
  "reproduce": "pytest -q tests/test_economy_gateway.py -k TestGateway or TestLazy or TestRole or Suff",
34
- "seconds": 2.63
34
+ "seconds": 2.62
35
35
  },
36
36
  "economy-contracts": {
37
37
  "ok": true,
38
38
  "reproduce": "pytest -q tests/test_economy_contracts.py tests/test_economy_v2.py",
39
- "seconds": 4.0
39
+ "seconds": 3.92
40
40
  },
41
41
  "economy-evals": {
42
42
  "ok": true,
43
43
  "reproduce": "pytest -q tests/test_economy_evals.py",
44
- "seconds": 3.22
44
+ "seconds": 3.17
45
45
  },
46
46
  "economy-qpt": {
47
47
  "ok": true,
48
48
  "reproduce": "pytest -q tests/test_qpt_v2.py tests/test_economy_fleet_qpt.py",
49
- "seconds": 8.55
49
+ "seconds": 8.57
50
50
  },
51
51
  "economy-receipt": {
52
52
  "ok": true,
53
53
  "reproduce": "python -c import json, re, subprocess, sys\nfrom pathlib import Path\nsys.path.insert(0, 'scripts')\nimport validate as V\np = Path(V.ECONOMY_RECEIPT_PATH)\nif not p.is_file():\n print('missing receipt:', p); sys.exit(1)\nr = json.loads(p.read_text())\nbad = []\nif r.get('schema') != V.ECONOMY_RECEIPT_SCHEMA:\n bad.append(('schema', r.get('schema')))\nvs = r.get('validated_sha') or ''\nok_sha = subprocess.run(['git','cat-file','-e',\n vs + '^{commit}'], capture_output=True).returncode == 0\nif not ok_sha: bad.append(('validated_sha-not-a-commit', vs))\nhead = subprocess.run(['git','rev-parse','HEAD'],\n capture_output=True, text=True).stdout.strip()\n# PR merge ref: HEAD^2 is the pushed branch tip \u2014 the Option-A\n# pair (functional commit + receipt commit) sits one level down.\nhead2 = subprocess.run(['git','rev-parse','HEAD^2'],\n capture_output=True, text=True).stdout.strip()\nbase = head2 if __import__('re').fullmatch(r'[0-9a-f]{40}', head2) else head\nhead1 = subprocess.run(['git','rev-parse', base + '~1'],\n capture_output=True, text=True).stdout.strip()\nif vs not in (base, head1):\n bad.append(('validated_sha-stale', vs, head))\ncanon = set(V._economy_gate_names())\nextra = set(r.get('gates', {})) - canon\nif extra: bad.append(('noncanonical-gates', sorted(extra)))\npat = re.compile('tests/' + r'\\S+' + r'\\.py')\nfor g, e in r.get('gates', {}).items():\n for t in pat.findall(e.get('reproduce') or ''):\n if not Path(t).is_file():\n bad.append(('dead-reproduce-path', g, t))\nif r.get('verdict') not in ('validated', 'failed'):\n bad.append(('verdict', r.get('verdict')))\nif bad: print(bad); sys.exit(1)\nprint('receipt coherent:', len(r['gates']), 'gates,',\n 'sha bound')\n",
54
- "seconds": 0.34
54
+ "seconds": 0.35
55
55
  },
56
56
  "economy-reconcile": {
57
57
  "ok": true,
58
58
  "reproduce": "pytest -q tests/test_economy_gateway.py tests/test_economy_evals.py -k reconcil or mismatch or unobserved",
59
- "seconds": 3.1
59
+ "seconds": 2.87
60
60
  },
61
61
  "economy-resume": {
62
62
  "ok": true,
63
63
  "reproduce": "pytest -q tests/test_economy_gateway.py -k resume or checkpoint",
64
- "seconds": 2.68
64
+ "seconds": 2.62
65
65
  },
66
66
  "economy-routing": {
67
67
  "ok": true,
68
68
  "reproduce": "pytest -q tests/test_economy_evals.py -k routing or profile or champion or simple_task",
69
- "seconds": 3.07
69
+ "seconds": 2.95
70
70
  },
71
71
  "economy-surface": {
72
72
  "ok": true,
73
73
  "reproduce": "python -c import subprocess, sys\ncmds = [\n ['platformforge','economy','doctor'],\n ['platformforge','economy','checkpoint','--run-id','gate',\n '--spent','{\"tokens\":1}'],\n ['platformforge','economy','resume','--run-id','gate'],\n ['platformforge','economy','reconcile',\n '--planned','{\"tokens\":1}','--observed','{\"tokens\":2}'],\n ['platformforge','economy','explain','--run-id','gate'],\n ['platformforge','cache','stats'],\n ['platformforge','cache','gc'],\n ['platformforge','context','capsule','--task','t',\n '--facts','[{\"fact_id\":\"f\"}]'],\n ['platformforge','context','gc'],\n ['platformforge','routing','explain','--signal','{}'],\n ['platformforge','routing','compare',\n '--champion','{}','--challenger','{}'],\n]\nfor c in cmds:\n r = subprocess.run(c, capture_output=True)\n if r.returncode not in (0, 2):\n print('FAIL', c, r.returncode, r.stderr[-300:])\n sys.exit(1)\nprint('all economy verbs respond')\n",
74
- "seconds": 15.63
74
+ "seconds": 16.02
75
75
  },
76
76
  "economy-verification": {
77
77
  "ok": true,
78
78
  "reproduce": "pytest -q tests/test_economy_pricing_verify.py",
79
- "seconds": 2.64
79
+ "seconds": 2.87
80
80
  }
81
81
  },
82
- "generated_at": "2026-10-23T00:41:26Z",
82
+ "generated_at": "2026-10-23T04:16:58Z",
83
83
  "kind": "platformforge/economy-validation-receipt/1",
84
84
  "known_gaps": [
85
85
  "real provider pricing catalog not bundled (declared-rates engine only, by design)",
@@ -93,7 +93,7 @@
93
93
  "remote_ci": "not independently verified",
94
94
  "schema": "platformforge/economy-validation-receipt/v1",
95
95
  "spec": "prompt_evo_economy.md",
96
- "validated_sha": "f245fbab25869f66b7e13c7d4f844864a1697041",
96
+ "validated_sha": "b3b4558bedfcfd434034af1573c3129128cca12a",
97
97
  "validator": "scripts/validate.py",
98
98
  "validator_version": "economy-validation-receipt/v1",
99
99
  "verdict": "validated"
@@ -4,4 +4,4 @@ Deterministic-first, offline-first, evidence-first. The core never imports
4
4
  LLM SDKs, cloud SDKs, or MCP — those live behind optional adapters.
5
5
  """
6
6
 
7
- __version__ = "0.2.1"
7
+ __version__ = "0.2.2"
@@ -100,6 +100,7 @@ import json
100
100
  import os
101
101
  import re
102
102
  import shutil
103
+ import stat
103
104
  import sys
104
105
  import tempfile
105
106
  import time
@@ -107,10 +108,10 @@ from collections.abc import Iterable, Mapping
107
108
  from pathlib import Path, PurePosixPath
108
109
  from typing import Any
109
110
 
110
- _FORGECONTEXT_VERSION = "1.3.2"
111
+ _FORGECONTEXT_VERSION = "1.3.3"
111
112
  # Filled by the vendor step (scripts/installkit/vendor.py) — the sha256 of
112
113
  # the canonical source body, so drift checks can compare vendored copies.
113
- _SOURCE_SHA256 = "2aab49d08c331431"
114
+ _SOURCE_SHA256 = "18ebe75c6281a3f5"
114
115
 
115
116
  SCHEMA_MANIFEST = "forge/context/v1"
116
117
  SCHEMA_REGISTRY = "forge/context-registry/v1"
@@ -241,12 +242,17 @@ def _load_json(path: Path, default: Any = None) -> Any:
241
242
 
242
243
  def _atomic_write(path: Path, data: bytes) -> None:
243
244
  path.parent.mkdir(parents=True, exist_ok=True)
245
+ # mkstemp lands 0600 — preserve an existing file's mode so a managed
246
+ # merge never downgrades the user's permissions.
247
+ mode = stat.S_IMODE(path.stat().st_mode) if path.is_file() else None
244
248
  fd, tmp = tempfile.mkstemp(prefix=path.name, dir=str(path.parent))
245
249
  try:
246
250
  with os.fdopen(fd, "wb") as fh:
247
251
  fh.write(data)
248
252
  fh.flush()
249
253
  os.fsync(fh.fileno())
254
+ if mode is not None:
255
+ os.chmod(tmp, mode)
250
256
  os.replace(tmp, path)
251
257
  finally:
252
258
  if os.path.exists(tmp):
@@ -269,15 +275,18 @@ def _pid_alive(pid: int) -> bool | None:
269
275
 
270
276
 
271
277
  class _Lock:
272
- """O_EXCL lockfile carrying ``{pid, created_at}``. Stale locks — dead
273
- holder or older than ``stale_after_s`` — are reclaimed once so an
274
- interrupted op never bricks the registry."""
278
+ """O_EXCL lockfile carrying ``{pid, created_at, token}``. Stale locks —
279
+ dead holder or older than ``stale_after_s`` — are reclaimed once so an
280
+ interrupted op never bricks the registry. The token guards release:
281
+ a file reclaimed or rewritten by another claimant is never unlinked
282
+ by ``__exit__``."""
275
283
 
276
284
  def __init__(self, lock: Path, stale_after_s: float = 900.0) -> None:
277
285
  self._lock = lock
278
286
  self._stale = stale_after_s
279
287
  self.held = False
280
288
  self.recovered = False
289
+ self._token: str | None = None
281
290
 
282
291
  def __enter__(self) -> _Lock:
283
292
  try:
@@ -294,12 +303,30 @@ class _Lock:
294
303
  E_LOCKED, f"context lock at {self._lock} could not be reclaimed"
295
304
  ) from exc
296
305
  self.recovered = True
297
- self._create()
306
+ try:
307
+ self._create()
308
+ except FileExistsError:
309
+ raise LockError(
310
+ E_LOCKED,
311
+ f"context lock at {self._lock} lost to a concurrent reclaimer",
312
+ ) from None
298
313
  return self
299
314
 
300
315
  def _create(self) -> None:
316
+ self._token = hashlib.sha256(
317
+ f"{os.getpid()}:{time.time_ns()}:{self._lock}".encode()
318
+ ).hexdigest()[:24]
301
319
  fd = os.open(str(self._lock), os.O_CREAT | os.O_EXCL | os.O_WRONLY)
302
- os.write(fd, _json_bytes({"pid": os.getpid(), "created_at": _utc_now()}))
320
+ os.write(
321
+ fd,
322
+ _json_bytes(
323
+ {
324
+ "pid": os.getpid(),
325
+ "created_at": _utc_now(),
326
+ "token": self._token,
327
+ }
328
+ ),
329
+ )
303
330
  os.close(fd)
304
331
  self.held = True
305
332
 
@@ -331,9 +358,16 @@ class _Lock:
331
358
  return age > self._stale
332
359
 
333
360
  def __exit__(self, *exc: object) -> None:
334
- if self.held:
335
- with contextlib.suppress(OSError):
336
- self._lock.unlink()
361
+ try:
362
+ if self.held:
363
+ # Only release a lock that still carries OUR token — a
364
+ # reclaimed/stolen file belongs to its current claimant.
365
+ doc = _load_json(self._lock)
366
+ if isinstance(doc, dict) and doc.get("token") == self._token:
367
+ with contextlib.suppress(OSError):
368
+ self._lock.unlink()
369
+ finally:
370
+ self.held = False
337
371
 
338
372
 
339
373
  def acquire_lock(ctx_dir: Path) -> _Lock:
@@ -1417,7 +1451,23 @@ def _qualified_ids(manifest: Mapping[str, Any]) -> list[str]:
1417
1451
  def _entry_from_manifest(
1418
1452
  manifest: dict[str, Any], cap_sha: str, prev: dict[str, Any] | None, now: str
1419
1453
  ) -> dict[str, Any]:
1420
- inst = manifest["installed"]
1454
+ fid = str(manifest.get("forge_id") or "?")
1455
+ inst = manifest.get("installed")
1456
+ if not isinstance(inst, Mapping):
1457
+ raise ContextError(
1458
+ E_SCHEMA,
1459
+ f"{_capability_rel(fid)}: missing required 'installed' — "
1460
+ "repair or remove the capability file",
1461
+ )
1462
+ missing = [
1463
+ k for k in ("forge_id", "name", "version", "state", "recorded_by") if k not in manifest
1464
+ ]
1465
+ if missing:
1466
+ raise ContextError(
1467
+ E_SCHEMA,
1468
+ f"{_capability_rel(fid)}: missing required keys {missing} — "
1469
+ "repair or remove the capability file",
1470
+ )
1421
1471
  return {
1422
1472
  "forge_id": manifest["forge_id"],
1423
1473
  "owner": manifest["forge_id"],
@@ -1535,31 +1585,44 @@ def _recover_journal(ctx: Path, root: Path) -> dict[str, Any] | None:
1535
1585
  recovered: dict[str, Any] | None = None
1536
1586
  now = _utc_now()
1537
1587
  if isinstance(journal, dict):
1538
- op = journal.get("op")
1539
- if op == "register" and isinstance(journal.get("manifest"), dict):
1540
- if not validate_manifest(journal["manifest"]):
1541
- _apply_register(ctx, root, journal["manifest"], now)
1542
- recovered = {"op": "register", "forge_id": journal["manifest"]["forge_id"]}
1543
- elif op == "unregister" and isinstance(journal.get("forge_id"), str):
1544
- _apply_unregister(ctx, root, journal["forge_id"], now)
1545
- recovered = {"op": "unregister", "forge_id": journal["forge_id"]}
1546
- elif op == "install" and isinstance(journal.get("manifest"), dict):
1547
- if not validate_manifest(journal["manifest"]):
1548
- _apply_register(ctx, root, journal["manifest"], now)
1549
- if journal.get("docs", True):
1550
- _docs_install_apply(
1551
- root, journal["manifest"], tuple(journal.get("legacy_tags") or ())
1552
- )
1553
- recovered = {
1554
- "op": "install",
1555
- "forge_id": journal["manifest"]["forge_id"],
1556
- }
1557
- elif op == "uninstall" and isinstance(journal.get("forge_id"), str):
1558
- _apply_unregister(ctx, root, journal["forge_id"], now)
1559
- _docs_uninstall_apply(
1560
- root, journal["forge_id"], tuple(journal.get("legacy_tags") or ())
1561
- )
1562
- recovered = {"op": "uninstall", "forge_id": journal["forge_id"]}
1588
+ try:
1589
+ op = journal.get("op")
1590
+ if op == "register" and isinstance(journal.get("manifest"), dict):
1591
+ if not validate_manifest(journal["manifest"]):
1592
+ _apply_register(ctx, root, journal["manifest"], now)
1593
+ recovered = {"op": "register", "forge_id": journal["manifest"]["forge_id"]}
1594
+ elif op == "unregister" and isinstance(journal.get("forge_id"), str):
1595
+ _apply_unregister(ctx, root, journal["forge_id"], now)
1596
+ recovered = {"op": "unregister", "forge_id": journal["forge_id"]}
1597
+ elif op == "install" and isinstance(journal.get("manifest"), dict):
1598
+ if not validate_manifest(journal["manifest"]):
1599
+ _apply_register(ctx, root, journal["manifest"], now)
1600
+ if journal.get("docs", True):
1601
+ _docs_install_apply(
1602
+ root, journal["manifest"], tuple(journal.get("legacy_tags") or ())
1603
+ )
1604
+ recovered = {
1605
+ "op": "install",
1606
+ "forge_id": journal["manifest"]["forge_id"],
1607
+ }
1608
+ elif op == "uninstall" and isinstance(journal.get("forge_id"), str):
1609
+ _apply_unregister(ctx, root, journal["forge_id"], now)
1610
+ _docs_uninstall_apply(
1611
+ root, journal["forge_id"], tuple(journal.get("legacy_tags") or ())
1612
+ )
1613
+ recovered = {"op": "uninstall", "forge_id": journal["forge_id"]}
1614
+ except ContextError as exc:
1615
+ # A poisoned journal must not wedge every later op: the redo hit a
1616
+ # conflict that post-dates the crash (foreign doc, non-UTF-8 file).
1617
+ # Quarantine the intent — evidence preserved — and report it,
1618
+ # instead of failing forever on the same journal.
1619
+ _quarantine(jpath, now.replace(":", ""))
1620
+ _txn_drop(ctx)
1621
+ return {
1622
+ "op": str(journal.get("op") or "?"),
1623
+ "quarantined": True,
1624
+ "error": f"{exc.kind}: {exc.detail}",
1625
+ }
1563
1626
  if recovered is None:
1564
1627
  _quarantine(jpath, now.replace(":", ""))
1565
1628
  _txn_drop(ctx)
@@ -1685,8 +1748,16 @@ def repair_context(root: Path | str) -> dict[str, Any]:
1685
1748
  now = _utc_now()
1686
1749
  previous = {e["forge_id"]: e for e in reg["forges"]}
1687
1750
  entries = []
1751
+ invalid: list[dict[str, Any]] = []
1688
1752
  for fid in sorted(manifests):
1689
1753
  doc = manifests[fid]
1754
+ # A capability file that fails schema validation is reported and
1755
+ # kept out of the rebuilt registry — never an untyped crash on
1756
+ # the one path meant to converge a broken context.
1757
+ problems = validate_manifest(doc)
1758
+ if problems:
1759
+ invalid.append({"forge_id": fid, "problems": problems[:5]})
1760
+ continue
1690
1761
  cap_sha = _sha_file(ctx / CAPABILITIES_DIR / f"{fid}.json")
1691
1762
  entries.append(_entry_from_manifest(doc, cap_sha, previous.get(fid), now))
1692
1763
  reg["forges"] = entries
@@ -1698,7 +1769,8 @@ def repair_context(root: Path | str) -> dict[str, Any]:
1698
1769
  # foreign-installer content is never ours to remove.
1699
1770
  return {
1700
1771
  "status": "repaired",
1701
- "forges": sorted(manifests),
1772
+ "forges": sorted(e["forge_id"] for e in entries),
1773
+ "invalid": invalid,
1702
1774
  "recovered": recovered,
1703
1775
  "notes": notes,
1704
1776
  "written": written,
@@ -18,24 +18,27 @@ silently degrading.
18
18
 
19
19
  from __future__ import annotations
20
20
 
21
+ import contextlib
21
22
  import hashlib
22
23
  import json
23
24
  import os
24
25
  import platform
25
26
  import re
27
+ import stat
26
28
  import sys
27
29
  import tempfile
28
30
  import time
31
+ import uuid
29
32
  from importlib import metadata as importlib_metadata
30
33
  from collections.abc import Callable
31
34
  from dataclasses import dataclass, field
32
- from pathlib import Path
35
+ from pathlib import Path, PurePosixPath
33
36
  from typing import Any
34
37
 
35
- _INSTALLKIT_VERSION = "1.0.2"
38
+ _INSTALLKIT_VERSION = "1.0.3"
36
39
  # Filled by the vendor step (scripts/installkit/vendor.py) — the sha256 of
37
40
  # the canonical source body, so drift checks can compare vendored copies.
38
- _SOURCE_SHA256 = "a15ca78bb34a0109"
41
+ _SOURCE_SHA256 = "b102bf086301aa0d"
39
42
 
40
43
  SCHEMA_MANIFEST = "forge/InstallationManifest/v1"
41
44
  SCHEMA_RECEIPT = "forge/InstallReceipt/v1"
@@ -67,6 +70,7 @@ E_DRIFT = "FORGE-INSTALL-DRIFT-UNREPAIRABLE"
67
70
  E_UNSUPPORTED = "FORGE-INSTALL-UNSUPPORTED"
68
71
  E_SPAWN = "FORGE-INSTALL-SPAWN-DISABLED"
69
72
  E_VERIFY = "FORGE-INSTALL-VERIFY-FAILED"
73
+ E_UNSAFE = "FORGE-INSTALL-UNSAFE-PATH"
70
74
  E_WRITE = "FORGE-INSTALL-WRITE-FAILED"
71
75
 
72
76
 
@@ -125,16 +129,37 @@ def _sha_file(path: Path) -> str:
125
129
 
126
130
  def _atomic_write(path: Path, data: bytes) -> None:
127
131
  path.parent.mkdir(parents=True, exist_ok=True)
132
+ # Preserve the existing file's mode — mkstemp always creates 0600, and
133
+ # silently downgrading a user's 0644 doc is a destructive side effect.
134
+ mode = stat.S_IMODE(path.stat().st_mode) if path.is_file() else None
128
135
  fd, tmp = tempfile.mkstemp(prefix=path.name, dir=str(path.parent))
129
136
  try:
130
137
  with os.fdopen(fd, "wb") as fh:
131
138
  fh.write(data)
139
+ fh.flush()
140
+ os.fsync(fh.fileno())
141
+ if mode is not None:
142
+ os.chmod(tmp, mode)
132
143
  os.replace(tmp, path)
133
144
  finally:
134
145
  if os.path.exists(tmp):
135
146
  os.unlink(tmp)
136
147
 
137
148
 
149
+ _SAFE_REL_RE = re.compile(r"^(?!/)(?!~)[A-Za-z0-9._][A-Za-z0-9_./-]*$")
150
+
151
+
152
+ def _safe_rel(rel: str) -> bool:
153
+ """A ledger/asset relative path must stay inside the install root: no
154
+ ``..`` segments, no absolute/drive forms, no backslashes."""
155
+ return (
156
+ bool(_SAFE_REL_RE.match(rel))
157
+ and "\\" not in rel
158
+ and not any(part == ".." for part in PurePosixPath(rel).parts)
159
+ and not re.match(r"^[A-Za-z]:", rel)
160
+ )
161
+
162
+
138
163
  def _json_bytes(doc: dict[str, Any]) -> bytes:
139
164
  return (json.dumps(doc, indent=2, sort_keys=True) + "\n").encode("utf-8")
140
165
 
@@ -291,6 +316,9 @@ class Ledger:
291
316
  keys are user content); every other entry is compared by sha256."""
292
317
  out = []
293
318
  for rel, e in sorted(self.doc["entries"].items()):
319
+ if not _safe_rel(rel):
320
+ out.append({"path": rel, "status": "unsafe"})
321
+ continue
294
322
  p = root / rel
295
323
  if not p.exists():
296
324
  out.append({"path": rel, "status": "missing"})
@@ -360,6 +388,7 @@ class _Lock:
360
388
  def __init__(self, lock: Path, stale_after_s: float = 900.0) -> None:
361
389
  self._lock = lock
362
390
  self._stale = stale_after_s
391
+ self._token = uuid.uuid4().hex
363
392
  self.held = False
364
393
  self.recovered = False
365
394
 
@@ -379,14 +408,23 @@ class _Lock:
379
408
  E_LOCKED, f"install lock at {self._lock} could not be reclaimed"
380
409
  ) from exc
381
410
  self.recovered = True
382
- self._create()
411
+ try:
412
+ self._create()
413
+ except FileExistsError:
414
+ # A third party won the reclaim race — that is a normal lock
415
+ # contention outcome, not an internal error.
416
+ raise LockError(
417
+ E_LOCKED, f"install lock at {self._lock} re-acquired during reclaim"
418
+ ) from None
383
419
  return self
384
420
 
385
421
  def _create(self) -> None:
386
422
  fd = os.open(str(self._lock), os.O_CREAT | os.O_EXCL | os.O_WRONLY)
387
423
  os.write(
388
424
  fd,
389
- _json_bytes({"pid": os.getpid(), "created_at": _utc_now()}),
425
+ _json_bytes(
426
+ {"pid": os.getpid(), "token": self._token, "created_at": _utc_now()}
427
+ ),
390
428
  )
391
429
  os.close(fd)
392
430
  self.held = True
@@ -419,11 +457,17 @@ class _Lock:
419
457
  return age > self._stale
420
458
 
421
459
  def __exit__(self, *exc: object) -> None:
422
- if self.held:
423
- try:
424
- self._lock.unlink()
425
- except OSError:
426
- pass
460
+ try:
461
+ if self.held:
462
+ holder = _load_json(self._lock)
463
+ # Only remove the lock file when it still carries our token —
464
+ # after a stale reclaim the on-disk lock may belong to a
465
+ # newer claimant, and unlinking it would admit a third.
466
+ if isinstance(holder, dict) and holder.get("token") == self._token:
467
+ with contextlib.suppress(OSError):
468
+ self._lock.unlink()
469
+ finally:
470
+ self.held = False
427
471
 
428
472
 
429
473
  def acquire_lock(state_dir: Path, timeout_s: float = 0.0) -> _Lock:
@@ -677,6 +721,11 @@ def plan(ctx: InstallContext) -> dict[str, Any]:
677
721
  kind = _asset_kind(rel)
678
722
  if kind not in kinds:
679
723
  continue
724
+ if not _safe_rel(rel):
725
+ raise InstallError(
726
+ E_UNSAFE,
727
+ f"{rel!r}: escapes the install root — remove or fix the asset path",
728
+ )
680
729
  target = ctx.root / rel
681
730
  exists = target.exists()
682
731
  files.append(
@@ -786,6 +835,11 @@ def apply_install(ctx: InstallContext, *, approved: bool = False) -> dict[str, A
786
835
  kind = _asset_kind(rel)
787
836
  if kind not in kinds:
788
837
  continue
838
+ if not _safe_rel(rel):
839
+ raise InstallError(
840
+ E_UNSAFE,
841
+ f"{rel!r}: escapes the install root — remove or fix the asset path",
842
+ )
789
843
  data = assets[rel]
790
844
  if kind in ("skill", "agent"):
791
845
  ctx_bytes[kind] += len(data)
@@ -1165,10 +1219,10 @@ def repair(ctx: InstallContext) -> dict[str, Any]:
1165
1219
  for d in drift:
1166
1220
  rel = d["path"]
1167
1221
  entry = ledger.get(rel)
1168
- target = ctx.root / rel
1169
- if entry is None:
1222
+ if entry is None or not _safe_rel(rel):
1170
1223
  skipped.append(rel)
1171
1224
  continue
1225
+ target = ctx.root / rel
1172
1226
  data = _repair_content(ctx, rel, entry, assets, target)
1173
1227
  if data is None:
1174
1228
  skipped.append(rel)
@@ -1216,6 +1270,11 @@ def uninstall(ctx: InstallContext, *, purge_state: bool = False) -> dict[str, An
1216
1270
  ledger = Ledger.load(ctx.state_dir)
1217
1271
  removed, kept = [], []
1218
1272
  for rel in ledger.owned_paths():
1273
+ if not _safe_rel(rel):
1274
+ # A poisoned ledger key must never resolve into an unlink outside
1275
+ # the install root — keep it (and the entry) for repair/triage.
1276
+ kept.append(rel)
1277
+ continue
1219
1278
  target = ctx.root / rel
1220
1279
  if rel in ctx.spec.marker_files and target.exists():
1221
1280
  # marker files: excise the block, keep the file
@@ -1295,9 +1354,18 @@ def _prune_empty_dirs(root: Path, removed: list[str]) -> None:
1295
1354
  first non-empty ancestor or ``root``. User dirs are never touched —
1296
1355
  ``rmdir`` refuses on non-empty directories by design."""
1297
1356
  seen: set[Path] = set()
1357
+ resolved_root = root.resolve()
1298
1358
  for rel in removed:
1299
- parent = (root / rel).parent
1300
- while parent != root and root in parent.parents and parent not in seen:
1359
+ # Entries may be ledger-relative keys or already-absolute paths
1360
+ # (detach receipts). Both must resolve INSIDE root before rmdir.
1361
+ try:
1362
+ fpath = Path(rel) if Path(rel).is_absolute() else root / rel
1363
+ fpath.resolve().relative_to(resolved_root)
1364
+ except (OSError, ValueError):
1365
+ continue
1366
+ parent = fpath.resolve().parent
1367
+ while parent != resolved_root and resolved_root in parent.parents \
1368
+ and parent not in seen:
1301
1369
  try:
1302
1370
  parent.rmdir()
1303
1371
  except OSError:
@@ -413,7 +413,9 @@ def uninstall(*, scope: str = "project", root: Path | None = None,
413
413
  if scope != "user" and _docs_leftovers(target):
414
414
  checks += _unregister_context(target)
415
415
  checks.append(_mcp_unset_project(target))
416
- return _receipt("uninstall", scope, target, status="completed",
416
+ return _receipt("uninstall", scope, target,
417
+ status="failed" if any(c.get("status") == "BLOCKED" for c in checks)
418
+ else "completed",
417
419
  checks=checks,
418
420
  extra={"removed": [], "kept": []})
419
421
  with kit.acquire_lock(state):
@@ -431,7 +433,8 @@ def uninstall(*, scope: str = "project", root: Path | None = None,
431
433
  checks += _unregister_context(target)
432
434
  checks.append(_mcp_unset_project(target))
433
435
  return _receipt(
434
- "uninstall", scope, target, status="completed",
436
+ "uninstall", scope, target,
437
+ status="failed" if any(c.get("status") == "BLOCKED" for c in checks) else "completed",
435
438
  checks=checks,
436
439
  extra={"removed": removed,
437
440
  "kept": out.get("preserved_modified", [])})
@@ -790,6 +793,9 @@ def _register_context(
790
793
  {"id": "context-registry", "status": "BLOCKED",
791
794
  "detail": f"{exc.kind}: {exc.detail}"}
792
795
  )
796
+ # BLOCKED num componente mandatório não sai exit 0 — os assets
797
+ # foram escritos mas o contrato install-2.0 falhou.
798
+ receipt["status"] = "failed"
793
799
 
794
800
 
795
801
  def _unregister_context(target: Path) -> list[dict[str, Any]]:
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "platformforge"
7
- version = "0.2.1"
7
+ version = "0.2.2"
8
8
  description = "Agentic Platform Engineering intelligence platform — deterministic, offline-first, evidence-first"
9
9
  readme = "README.md"
10
10
  license = { file = "LICENSE" }