invar-tools 1.3.1__tar.gz → 1.3.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 (237) hide show
  1. invar_tools-1.3.2/PKG-INFO +505 -0
  2. invar_tools-1.3.2/README.md +464 -0
  3. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/agents.md +1 -1
  4. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/design.md +4 -4
  5. invar_tools-1.3.2/docs/diagrams.md +200 -0
  6. invar_tools-1.3.2/docs/index.html +779 -0
  7. invar_tools-1.3.2/docs/logo.svg +8 -0
  8. invar_tools-1.3.2/docs/proposals/DX-61-functional-pattern-guidance.md +1137 -0
  9. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/index.md +32 -7
  10. invar_tools-1.3.2/docs/terminal-gif-guide.md +230 -0
  11. {invar_tools-1.3.1 → invar_tools-1.3.2}/pyproject.toml +1 -1
  12. {invar_tools-1.3.1 → invar_tools-1.3.2}/runtime/README.md +1 -1
  13. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/shell/templates.py +2 -2
  14. invar_tools-1.3.1/PKG-INFO +0 -377
  15. invar_tools-1.3.1/README.md +0 -336
  16. invar_tools-1.3.1/docs/index.html +0 -1107
  17. {invar_tools-1.3.1 → invar_tools-1.3.2}/.aider.conf.yml +0 -0
  18. {invar_tools-1.3.1 → invar_tools-1.3.2}/.claude/commands/audit.md +0 -0
  19. {invar_tools-1.3.1 → invar_tools-1.3.2}/.claude/commands/guard.md +0 -0
  20. {invar_tools-1.3.1 → invar_tools-1.3.2}/.claude/skills/develop/SKILL.md +0 -0
  21. {invar_tools-1.3.1 → invar_tools-1.3.2}/.claude/skills/investigate/SKILL.md +0 -0
  22. {invar_tools-1.3.1 → invar_tools-1.3.2}/.claude/skills/propose/SKILL.md +0 -0
  23. {invar_tools-1.3.1 → invar_tools-1.3.2}/.claude/skills/review/SKILL.md +0 -0
  24. {invar_tools-1.3.1 → invar_tools-1.3.2}/.cursorrules +0 -0
  25. {invar_tools-1.3.1 → invar_tools-1.3.2}/.github/workflows/ci.yml +0 -0
  26. {invar_tools-1.3.1 → invar_tools-1.3.2}/.github/workflows/publish.yml +0 -0
  27. {invar_tools-1.3.1 → invar_tools-1.3.2}/.gitignore +0 -0
  28. {invar_tools-1.3.1 → invar_tools-1.3.2}/.invar/archive/sessions-2025-12.md +0 -0
  29. {invar_tools-1.3.1 → invar_tools-1.3.2}/.invar/context.md +0 -0
  30. {invar_tools-1.3.1 → invar_tools-1.3.2}/.invar/examples/README.md +0 -0
  31. {invar_tools-1.3.1 → invar_tools-1.3.2}/.invar/examples/conftest.py +0 -0
  32. {invar_tools-1.3.1 → invar_tools-1.3.2}/.invar/examples/contracts.py +0 -0
  33. {invar_tools-1.3.1 → invar_tools-1.3.2}/.invar/examples/core_shell.py +0 -0
  34. {invar_tools-1.3.1 → invar_tools-1.3.2}/.invar/examples/workflow.md +0 -0
  35. {invar_tools-1.3.1 → invar_tools-1.3.2}/.invar/project-additions.md +0 -0
  36. {invar_tools-1.3.1 → invar_tools-1.3.2}/.invar/proposals/TEMPLATE.md +0 -0
  37. {invar_tools-1.3.1 → invar_tools-1.3.2}/.mcp.json +0 -0
  38. {invar_tools-1.3.1 → invar_tools-1.3.2}/.pre-commit-config.yaml +0 -0
  39. {invar_tools-1.3.1 → invar_tools-1.3.2}/.serena/.gitignore +0 -0
  40. {invar_tools-1.3.1 → invar_tools-1.3.2}/.serena/project.yml +0 -0
  41. {invar_tools-1.3.1 → invar_tools-1.3.2}/CLAUDE.md +0 -0
  42. {invar_tools-1.3.1 → invar_tools-1.3.2}/INVAR.md +0 -0
  43. {invar_tools-1.3.1 → invar_tools-1.3.2}/LICENSE +0 -0
  44. {invar_tools-1.3.1 → invar_tools-1.3.2}/LICENSE-GPL +0 -0
  45. {invar_tools-1.3.1 → invar_tools-1.3.2}/NOTICE +0 -0
  46. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/guide.md +0 -0
  47. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/history/decisions-2024.md +0 -0
  48. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/history/feedback/compliance-analysis.md +0 -0
  49. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/history/feedback/feedback-memo.md +0 -0
  50. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/history/feedback/index.md +0 -0
  51. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/history/index.md +0 -0
  52. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/history/original-vision.md +0 -0
  53. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/history/protocol-evolution.md +0 -0
  54. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/history/research/cruxeval-quick-validation.md +0 -0
  55. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/DX-23-entry-point-detection.md +0 -0
  56. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/DX-25-functional-patterns.md +0 -0
  57. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/DX-29-pure-content-detection.md +0 -0
  58. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/DX-37-coverage-integration.md +0 -0
  59. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/DX-38-contract-quality-rules.md +0 -0
  60. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/DX-39-workflow-efficiency.md +0 -0
  61. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/DX-40-smart-tool-redirect-hook.md +0 -0
  62. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/DX-41-automatic-review-orchestration.md +0 -0
  63. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/DX-42-workflow-auto-routing.md +0 -0
  64. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/DX-43-cross-platform-distribution.md +0 -0
  65. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/DX-46-documentation-audit.md +0 -0
  66. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/DX-48-code-structure-reorganization.md +0 -0
  67. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/DX-49-protocol-distribution-unification.md +0 -0
  68. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/DX-50-workflow-enforcement.md +0 -0
  69. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/DX-51-workflow-phase-visibility.md +0 -0
  70. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/DX-52-venv-dependency-injection.md +0 -0
  71. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/DX-53-review-loop-effectiveness.md +0 -0
  72. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/DX-54-agent-native-context-management.md +0 -0
  73. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/DX-55-claude-init-conflict-resolution.md +0 -0
  74. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/DX-56-template-sync-unification.md +0 -0
  75. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/DX-60-structured-rules-ssot.md +0 -0
  76. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/LX-01-multi-language-feasibility.md +0 -0
  77. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/completed/2024-12-21-guard-enhancements.md +0 -0
  78. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/completed/2024-12-21-language-inspired-enhancements.md +0 -0
  79. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/completed/2024-12-21-test-first-enhancement.md +0 -0
  80. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/completed/2025-12-21-dx-improvements.md +0 -0
  81. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/completed/2025-12-23-dx-20-property-testing-enhancements.md +0 -0
  82. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/completed/2025-12-23-dx-21-package-and-init.md +0 -0
  83. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/completed/AGENT-IMPROVEMENTS.md +0 -0
  84. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/completed/DX-11-documentation-restructure.md +0 -0
  85. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/completed/DX-12-hypothesis-fallback.md +0 -0
  86. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/completed/DX-13-incremental-prove.md +0 -0
  87. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/completed/DX-14-expanded-prove-usage.md +0 -0
  88. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/completed/DX-16-agent-tool-enforcement.md +0 -0
  89. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/completed/DX-17-workflow-enforcement.md +0 -0
  90. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/completed/DX-22-verification-strategy.md +0 -0
  91. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/completed/DX-24-mechanism-documentation.md +0 -0
  92. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/completed/DX-26-guard-simplification.md +0 -0
  93. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/completed/DX-27-system-prompt-protocol.md +0 -0
  94. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/completed/DX-28-semantic-verification.md +0 -0
  95. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/completed/DX-30-visible-workflow.md +0 -0
  96. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/completed/DX-31-adversarial-reviewer.md +0 -0
  97. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/completed/DX-32-workflow-iteration.md +0 -0
  98. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/completed/DX-33-verification-blind-spots.md +0 -0
  99. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/completed/DX-34-review-cycle.md +0 -0
  100. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/completed/DX-35-workflow-phase-separation.md +0 -0
  101. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/completed/DX-36-documentation-restructuring.md +0 -0
  102. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/completed/DX-45-template-consistency.md +0 -0
  103. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/proposals/completed/DX-47-command-skill-naming.md +0 -0
  104. {invar_tools-1.3.1/docs/proposals → invar_tools-1.3.2/docs/proposals/completed}/DX-57-claude-code-hooks.md +0 -0
  105. {invar_tools-1.3.1/docs/proposals → invar_tools-1.3.2/docs/proposals/completed}/DX-58-document-structure-optimization.md +0 -0
  106. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/reference/architecture/index.md +0 -0
  107. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/reference/contracts/advanced.md +0 -0
  108. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/reference/contracts/completeness.md +0 -0
  109. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/reference/contracts/doctests.md +0 -0
  110. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/reference/contracts/index.md +0 -0
  111. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/reference/contracts/pre-post.md +0 -0
  112. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/reference/documentation.md +0 -0
  113. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/reference/index.md +0 -0
  114. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/reference/proposal-workflow.md +0 -0
  115. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/reference/rules/index.md +0 -0
  116. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/reference/rules/severity.md +0 -0
  117. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/reference/verification/crosshair-vs-hypothesis.md +0 -0
  118. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/reference/verification/index.md +0 -0
  119. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/reference/verification/smart-routing.md +0 -0
  120. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/reference/workflow/index.md +0 -0
  121. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/reference/workflow/session-start.md +0 -0
  122. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/reference/workflow/usbv.md +0 -0
  123. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/test-reports/DX-55-test-report.md +0 -0
  124. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/test-reports/DX-56-test-report.md +0 -0
  125. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/test-reports/DX-58-test-scenario.md +0 -0
  126. {invar_tools-1.3.1 → invar_tools-1.3.2}/docs/vision.md +0 -0
  127. {invar_tools-1.3.1 → invar_tools-1.3.2}/runtime/LICENSE +0 -0
  128. {invar_tools-1.3.1 → invar_tools-1.3.2}/runtime/pyproject.toml +0 -0
  129. {invar_tools-1.3.1 → invar_tools-1.3.2}/runtime/src/invar_runtime/__init__.py +0 -0
  130. {invar_tools-1.3.1 → invar_tools-1.3.2}/runtime/src/invar_runtime/contracts.py +0 -0
  131. {invar_tools-1.3.1 → invar_tools-1.3.2}/runtime/src/invar_runtime/decorators.py +0 -0
  132. {invar_tools-1.3.1 → invar_tools-1.3.2}/runtime/src/invar_runtime/invariant.py +0 -0
  133. {invar_tools-1.3.1 → invar_tools-1.3.2}/runtime/src/invar_runtime/relations.py +0 -0
  134. {invar_tools-1.3.1 → invar_tools-1.3.2}/runtime/src/invar_runtime/resource.py +0 -0
  135. {invar_tools-1.3.1 → invar_tools-1.3.2}/scripts/smart-guard.sh +0 -0
  136. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/__init__.py +0 -0
  137. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/core/__init__.py +0 -0
  138. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/core/contracts.py +0 -0
  139. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/core/entry_points.py +0 -0
  140. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/core/extraction.py +0 -0
  141. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/core/format_specs.py +0 -0
  142. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/core/format_strategies.py +0 -0
  143. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/core/formatter.py +0 -0
  144. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/core/hypothesis_strategies.py +0 -0
  145. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/core/inspect.py +0 -0
  146. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/core/lambda_helpers.py +0 -0
  147. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/core/models.py +0 -0
  148. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/core/must_use.py +0 -0
  149. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/core/parser.py +0 -0
  150. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/core/postcondition_scope.py +0 -0
  151. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/core/property_gen.py +0 -0
  152. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/core/purity.py +0 -0
  153. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/core/purity_heuristics.py +0 -0
  154. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/core/references.py +0 -0
  155. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/core/review_trigger.py +0 -0
  156. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/core/rule_meta.py +0 -0
  157. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/core/rules.py +0 -0
  158. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/core/shell_analysis.py +0 -0
  159. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/core/shell_architecture.py +0 -0
  160. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/core/strategies.py +0 -0
  161. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/core/suggestions.py +0 -0
  162. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/core/sync_helpers.py +0 -0
  163. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/core/tautology.py +0 -0
  164. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/core/template_parser.py +0 -0
  165. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/core/timeout_inference.py +0 -0
  166. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/core/utils.py +0 -0
  167. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/core/verification_routing.py +0 -0
  168. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/mcp/__init__.py +0 -0
  169. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/mcp/__main__.py +0 -0
  170. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/mcp/server.py +0 -0
  171. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/py.typed +0 -0
  172. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/shell/__init__.py +0 -0
  173. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/shell/claude_hooks.py +0 -0
  174. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/shell/commands/__init__.py +0 -0
  175. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/shell/commands/guard.py +0 -0
  176. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/shell/commands/hooks.py +0 -0
  177. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/shell/commands/init.py +0 -0
  178. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/shell/commands/merge.py +0 -0
  179. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/shell/commands/mutate.py +0 -0
  180. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/shell/commands/perception.py +0 -0
  181. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/shell/commands/sync_self.py +0 -0
  182. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/shell/commands/template_sync.py +0 -0
  183. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/shell/commands/test.py +0 -0
  184. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/shell/commands/update.py +0 -0
  185. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/shell/config.py +0 -0
  186. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/shell/coverage.py +0 -0
  187. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/shell/fs.py +0 -0
  188. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/shell/git.py +0 -0
  189. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/shell/guard_helpers.py +0 -0
  190. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/shell/guard_output.py +0 -0
  191. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/shell/mcp_config.py +0 -0
  192. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/shell/mutation.py +0 -0
  193. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/shell/property_tests.py +0 -0
  194. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/shell/prove/__init__.py +0 -0
  195. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/shell/prove/accept.py +0 -0
  196. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/shell/prove/cache.py +0 -0
  197. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/shell/prove/crosshair.py +0 -0
  198. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/shell/prove/hypothesis.py +0 -0
  199. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/shell/subprocess_env.py +0 -0
  200. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/shell/template_engine.py +0 -0
  201. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/shell/testing.py +0 -0
  202. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/templates/CLAUDE.md.template +0 -0
  203. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/templates/__init__.py +0 -0
  204. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/templates/aider.conf.yml.template +0 -0
  205. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/templates/commands/audit.md +0 -0
  206. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/templates/commands/guard.md +0 -0
  207. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/templates/config/CLAUDE.md.jinja +0 -0
  208. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/templates/config/context.md.jinja +0 -0
  209. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/templates/config/pre-commit.yaml.jinja +0 -0
  210. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/templates/context.md.template +0 -0
  211. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/templates/cursorrules.template +0 -0
  212. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/templates/examples/README.md +0 -0
  213. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/templates/examples/conftest.py +0 -0
  214. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/templates/examples/contracts.py +0 -0
  215. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/templates/examples/core_shell.py +0 -0
  216. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/templates/examples/workflow.md +0 -0
  217. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/templates/hooks/PostToolUse.sh.jinja +0 -0
  218. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/templates/hooks/PreToolUse.sh.jinja +0 -0
  219. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/templates/hooks/Stop.sh.jinja +0 -0
  220. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/templates/hooks/UserPromptSubmit.sh.jinja +0 -0
  221. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/templates/hooks/__init__.py +0 -0
  222. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/templates/manifest.toml +0 -0
  223. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/templates/pre-commit-config.yaml.template +0 -0
  224. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/templates/proposal.md.template +0 -0
  225. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/templates/protocol/INVAR.md +0 -0
  226. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/templates/skills/develop/SKILL.md.jinja +0 -0
  227. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/templates/skills/investigate/SKILL.md.jinja +0 -0
  228. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/templates/skills/propose/SKILL.md.jinja +0 -0
  229. {invar_tools-1.3.1 → invar_tools-1.3.2}/src/invar/templates/skills/review/SKILL.md.jinja +0 -0
  230. {invar_tools-1.3.1 → invar_tools-1.3.2}/tests/__init__.py +0 -0
  231. {invar_tools-1.3.1 → invar_tools-1.3.2}/tests/conftest.py +0 -0
  232. {invar_tools-1.3.1 → invar_tools-1.3.2}/tests/integration/__init__.py +0 -0
  233. {invar_tools-1.3.1 → invar_tools-1.3.2}/tests/integration/test_cli_flags.py +0 -0
  234. {invar_tools-1.3.1 → invar_tools-1.3.2}/tests/integration/test_dx55_regression.py +0 -0
  235. {invar_tools-1.3.1 → invar_tools-1.3.2}/tests/integration/test_dx56_sync.py +0 -0
  236. {invar_tools-1.3.1 → invar_tools-1.3.2}/tests/test_subprocess_env.py +0 -0
  237. {invar_tools-1.3.1 → invar_tools-1.3.2}/uv.lock +0 -0
@@ -0,0 +1,505 @@
1
+ Metadata-Version: 2.4
2
+ Name: invar-tools
3
+ Version: 1.3.2
4
+ Summary: AI-native software engineering tools with design-by-contract verification
5
+ Project-URL: Homepage, https://github.com/tefx/invar
6
+ Project-URL: Documentation, https://github.com/tefx/invar#readme
7
+ Project-URL: Repository, https://github.com/tefx/invar
8
+ Project-URL: Issues, https://github.com/tefx/invar/issues
9
+ Author: Invar Team
10
+ License-Expression: GPL-3.0-or-later
11
+ License-File: LICENSE
12
+ License-File: LICENSE-GPL
13
+ License-File: NOTICE
14
+ Keywords: ai,code-quality,contracts,design-by-contract,static-analysis
15
+ Classifier: Development Status :: 3 - Alpha
16
+ Classifier: Intended Audience :: Developers
17
+ Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
18
+ Classifier: Programming Language :: Python :: 3
19
+ Classifier: Programming Language :: Python :: 3.11
20
+ Classifier: Programming Language :: Python :: 3.12
21
+ Classifier: Topic :: Software Development :: Quality Assurance
22
+ Classifier: Typing :: Typed
23
+ Requires-Python: >=3.11
24
+ Requires-Dist: crosshair-tool>=0.0.60
25
+ Requires-Dist: hypothesis>=6.0
26
+ Requires-Dist: invar-runtime>=1.0
27
+ Requires-Dist: jinja2>=3.0
28
+ Requires-Dist: mcp>=1.0
29
+ Requires-Dist: pre-commit>=3.0
30
+ Requires-Dist: pydantic>=2.0
31
+ Requires-Dist: returns>=0.20
32
+ Requires-Dist: rich>=13.0
33
+ Requires-Dist: typer>=0.9
34
+ Provides-Extra: dev
35
+ Requires-Dist: coverage[toml]>=7.0; extra == 'dev'
36
+ Requires-Dist: mypy>=1.0; extra == 'dev'
37
+ Requires-Dist: pytest-cov>=4.0; extra == 'dev'
38
+ Requires-Dist: pytest>=7.0; extra == 'dev'
39
+ Requires-Dist: ruff>=0.1; extra == 'dev'
40
+ Description-Content-Type: text/markdown
41
+
42
+ <p align="center">
43
+ <img src="docs/logo.svg" alt="Invar Logo" width="128" height="128">
44
+ </p>
45
+
46
+ <h1 align="center">Invar</h1>
47
+
48
+ <p align="center">
49
+ <strong>From AI-generated to AI-engineered code.</strong>
50
+ </p>
51
+
52
+ <p align="center">
53
+ Invar brings decades of software engineering best practices to AI-assisted development.<br>
54
+ Through automated verification, structured workflows, and proven design patterns,<br>
55
+ agents write code that's correct by construction—not by accident.
56
+ </p>
57
+
58
+ <p align="center">
59
+ <a href="https://badge.fury.io/py/invar-tools"><img src="https://badge.fury.io/py/invar-tools.svg" alt="PyPI version"></a>
60
+ <a href="https://www.python.org/downloads/"><img src="https://img.shields.io/badge/python-3.11+-blue.svg" alt="Python 3.11+"></a>
61
+ <a href="#license"><img src="https://img.shields.io/badge/License-Apache%202.0%20%2B%20GPL--3.0-blue.svg" alt="License"></a>
62
+ </p>
63
+
64
+ ### What It Looks Like
65
+
66
+ An AI agent, guided by Invar, writes code with formal contracts and built-in tests:
67
+
68
+ ```python
69
+ from invar_runtime import pre, post
70
+
71
+ @pre(lambda items: len(items) > 0)
72
+ @post(lambda result: result >= 0)
73
+ def average(items: list[float]) -> float:
74
+ """
75
+ Calculate the average of a non-empty list.
76
+
77
+ >>> average([1.0, 2.0, 3.0])
78
+ 2.0
79
+ >>> average([10.0])
80
+ 10.0
81
+ """
82
+ return sum(items) / len(items)
83
+ ```
84
+
85
+ Invar's Guard automatically verifies the code—the agent sees results and fixes issues without human intervention:
86
+
87
+ ```
88
+ $ invar guard
89
+ Invar Guard Report
90
+ ========================================
91
+ No violations found.
92
+ ----------------------------------------
93
+ Files checked: 1 | Errors: 0 | Warnings: 0
94
+ Contract coverage: 100% (1/1 functions)
95
+
96
+ Code Health: 100% ████████████████████ (Excellent)
97
+ ✓ Doctests passed
98
+ ✓ CrossHair: no counterexamples found
99
+ ✓ Hypothesis: property tests passed
100
+ ----------------------------------------
101
+ Guard passed.
102
+ ```
103
+
104
+ ---
105
+
106
+ ## 🚀 Quick Start
107
+
108
+ ### 📦 Two Packages, Different Purposes
109
+
110
+ ```
111
+ ┌───────────────────────────────────────────────────────────────────┐
112
+ │ Your Project │
113
+ │ ├── pyproject.toml │
114
+ │ │ └── dependencies = ["invar-runtime"] ← Ships with code │
115
+ │ │ │
116
+ │ └── Development (never enters production) │
117
+ │ └── uvx --from invar-tools invar guard ← Guides agents │
118
+ └───────────────────────────────────────────────────────────────────┘
119
+ ```
120
+
121
+ | Package | Purpose | Install |
122
+ |---------|---------|---------|
123
+ | **invar-runtime** | Runtime contracts. Add to your project dependencies. | `pip install invar-runtime` |
124
+ | **invar-tools** | Development tools. Guides agents during development. | `uvx --from invar-tools invar <cmd>` |
125
+
126
+ **Why uvx?** Always uses latest version, doesn't pollute project dependencies, auto-detects your project's venv.
127
+
128
+ ### 🆕 New Project
129
+
130
+ ```bash
131
+ # 1. Initialize with Claude Code (full experience)
132
+ uvx --from invar-tools invar init --claude
133
+
134
+ # 2. Add runtime contracts to your project
135
+ pip install invar-runtime
136
+ # Or add to pyproject.toml: dependencies = ["invar-runtime"]
137
+
138
+ # 3. Start coding with AI
139
+ ```
140
+
141
+ ### 📁 Existing Project
142
+
143
+ ```bash
144
+ # Update managed files, preserve your customizations
145
+ uvx --from invar-tools invar init --claude
146
+
147
+ # Or without Claude Code integration
148
+ uvx --from invar-tools invar init
149
+ ```
150
+
151
+ Invar's init is idempotent—safe to run multiple times. It detects existing configuration and updates only managed regions.
152
+
153
+ ### 💬 Example Interaction
154
+
155
+ **You say:**
156
+ > "Add a function that calculates compound interest with validation"
157
+
158
+ **Agent responds (automatically guided by Invar):**
159
+
160
+ ```
161
+ ✓ Check-In: my-project | main | clean
162
+
163
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
164
+ 📍 /develop → SPECIFY (2/4)
165
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
166
+
167
+ First, I'll define the contract:
168
+
169
+ @pre(lambda principal, rate, years: principal > 0 and rate >= 0 and years > 0)
170
+ @post(lambda result: result >= principal)
171
+ def compound_interest(principal: float, rate: float, years: int) -> float:
172
+ ...
173
+
174
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
175
+ 📍 /develop → VALIDATE (4/4)
176
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
177
+
178
+ $ invar guard --changed
179
+ WARN: missing doctest example (compound_interest)
180
+
181
+ [Agent adds doctest, re-runs guard]
182
+
183
+ $ invar guard --changed
184
+ Guard passed. (1 file, 0 errors)
185
+
186
+ ✓ Final: guard PASS | 0 errors, 0 warnings
187
+ ```
188
+
189
+ **Key insight:** The agent verifies and fixes automatically. You review the result, not the process.
190
+
191
+ ---
192
+
193
+ ## Why Invar?
194
+
195
+ ### ⚠️ The Problem: Unconstrained AI = Unpredictable Quality
196
+
197
+ Without guardrails, AI-generated code has systematic risks:
198
+ - **No specification** → Agent guesses intent, misses edge cases
199
+ - **No feedback loop** → Errors accumulate undetected
200
+ - **No workflow** → Jumps to implementation, skips validation
201
+ - **No separation** → I/O mixed with logic, code becomes untestable
202
+
203
+ Invar addresses each from the ground up.
204
+
205
+ ### ✅ Solution 1: Contracts as Specification
206
+
207
+ Contracts (`@pre`/`@post`) turn vague intent into verifiable specifications:
208
+
209
+ ```python
210
+ # Without contracts: "calculate average" is ambiguous
211
+ def average(items):
212
+ return sum(items) / len(items) # What if empty? What's the return type?
213
+
214
+ # With contracts: specification is explicit and verifiable
215
+ @pre(lambda items: len(items) > 0) # Precondition: non-empty input
216
+ @post(lambda result: result >= 0) # Postcondition: non-negative output
217
+ def average(items: list[float]) -> float:
218
+ """
219
+ >>> average([1.0, 2.0, 3.0])
220
+ 2.0
221
+ """
222
+ return sum(items) / len(items)
223
+ ```
224
+
225
+ **Benefits:**
226
+ - Agent knows exactly what to implement
227
+ - Edge cases are explicit in the contract
228
+ - Verification is automatic, not manual review
229
+
230
+ ### ✅ Solution 2: Multi-Layer Verification
231
+
232
+ Guard provides fast feedback. Agent sees errors, fixes immediately:
233
+
234
+ | Layer | Tool | Speed | What It Catches |
235
+ |-------|------|-------|-----------------|
236
+ | **Static** | Guard rules | ~0.5s | Architecture violations, missing contracts |
237
+ | **Doctest** | pytest | ~2s | Example correctness |
238
+ | **Property** | Hypothesis | ~10s | Edge cases via random inputs |
239
+ | **Symbolic** | CrossHair | ~30s | Mathematical proof of contracts |
240
+
241
+ ```
242
+ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
243
+ │ ⚡ Static │ → │ 🧪 Doctest│ → │ 🎲 Property│ → │ 🔬 Symbolic│
244
+ │ ~0.5s │ │ ~2s │ │ ~10s │ │ ~30s │
245
+ └──────────┘ └──────────┘ └──────────┘ └──────────┘
246
+ ```
247
+
248
+ ```
249
+ Agent writes code
250
+
251
+ invar guard ←──────┐
252
+ ↓ │
253
+ Error found? │
254
+ ↓ Yes │
255
+ Agent fixes ────────┘
256
+ ↓ No
257
+ Done ✓
258
+ ```
259
+
260
+ ### ✅ Solution 3: Workflow Discipline
261
+
262
+ The USBV workflow forces "specify before implement":
263
+
264
+ ```
265
+ 🔍 Understand → 📝 Specify → 🔨 Build → ✓ Validate
266
+ │ │ │ │
267
+ Context Contracts Code Guard
268
+ ```
269
+
270
+ Skill routing ensures agents enter through the correct workflow:
271
+
272
+ | User Intent | Skill Invoked | Behavior |
273
+ |-------------|---------------|----------|
274
+ | "why does X fail?" | `/investigate` | Research only, no code changes |
275
+ | "should we use A or B?" | `/propose` | Present options with trade-offs |
276
+ | "add feature X" | `/develop` | Full USBV workflow |
277
+ | (after develop) | `/review` | Adversarial review with fix loop |
278
+
279
+ ### ✅ Solution 4: Architecture Constraints
280
+
281
+ | Pattern | Enforcement | Benefit |
282
+ |---------|-------------|---------|
283
+ | **Core/Shell** | Guard blocks I/O imports in Core | 100% testable business logic |
284
+ | **Result[T, E]** | Guard warns if Shell returns bare values | Explicit error handling |
285
+
286
+ ### 🔮 Future: Quality Guidance (DX-61)
287
+
288
+ Beyond "correct or not"—Invar will suggest improvements:
289
+
290
+ ```
291
+ SUGGEST: 3 string parameters in 'find_symbol'
292
+ → Consider NewType for semantic clarity
293
+ ```
294
+
295
+ From gatekeeper to mentor.
296
+
297
+ ---
298
+
299
+ ## 🏗️ Core Concepts
300
+
301
+ ### Core/Shell Architecture
302
+
303
+ Separate pure logic from I/O for maximum testability:
304
+
305
+ | Zone | Location | Requirements |
306
+ |------|----------|--------------|
307
+ | **Core** | `**/core/**` | `@pre`/`@post` contracts, doctests, no I/O imports |
308
+ | **Shell** | `**/shell/**` | `Result[T, E]` return types |
309
+
310
+ ```
311
+ ┌─────────────────────────────────────────────┐
312
+ │ 🐚 Shell (I/O Layer) │
313
+ │ load_config, save_result, fetch_data │
314
+ └──────────────────┬──────────────────────────┘
315
+
316
+
317
+ ┌─────────────────────────────────────────────┐
318
+ │ 💎 Core (Pure Logic) │
319
+ │ parse_config, validate, calculate │
320
+ └──────────────────┬──────────────────────────┘
321
+
322
+ ▼ Result[T, E]
323
+ ```
324
+
325
+ ```python
326
+ # Core: Pure, testable, provable
327
+ def parse_config(content: str) -> Config:
328
+ return Config.parse(content)
329
+
330
+ # Shell: Handles I/O, returns Result
331
+ def load_config(path: Path) -> Result[Config, str]:
332
+ try:
333
+ return Success(parse_config(path.read_text()))
334
+ except FileNotFoundError:
335
+ return Failure(f"Not found: {path}")
336
+ ```
337
+
338
+ ### Session Protocol
339
+
340
+ Clear boundaries for every AI session:
341
+
342
+ | Phase | Format | Purpose |
343
+ |-------|--------|---------|
344
+ | **Start** | `✓ Check-In: project \| branch \| status` | Context visibility |
345
+ | **End** | `✓ Final: guard PASS \| 0 errors` | Verification proof |
346
+
347
+ ### Intellectual Heritage
348
+
349
+ **Foundational Theory:**
350
+ Design-by-Contract (Meyer, 1986) ·
351
+ Functional Core/Imperative Shell (Bernhardt) ·
352
+ Property-Based Testing (QuickCheck, 2000) ·
353
+ Symbolic Execution (King, 1976)
354
+
355
+ **Inspired By:**
356
+ Eiffel · Dafny · Idris · Haskell
357
+
358
+ **AI Programming Research:**
359
+ AlphaCodium · Parsel · Reflexion · Clover
360
+
361
+ **Dependencies:**
362
+ [deal](https://github.com/life4/deal) ·
363
+ [returns](https://github.com/dry-python/returns) ·
364
+ [CrossHair](https://github.com/pschanely/CrossHair) ·
365
+ [Hypothesis](https://hypothesis.readthedocs.io/)
366
+
367
+ ---
368
+
369
+ ## 🖥️ Platform Experience
370
+
371
+ | Feature | Claude Code | Other Editors |
372
+ |---------|-------------|---------------|
373
+ | CLI verification (`invar guard`) | ✅ | ✅ |
374
+ | Protocol document (INVAR.md) | ✅ | ✅ |
375
+ | MCP tool integration | ✅ Auto-configured | Manual setup possible |
376
+ | Workflow skills | ✅ Auto-configured | Include in system prompt |
377
+ | Pre-commit hooks | ✅ | ✅ |
378
+ | Sub-agent review | ✅ | — |
379
+
380
+ **Claude Code** provides the full experience—MCP tools, skill routing, and hooks are auto-configured by `invar init --claude`.
381
+
382
+ **Other editors** can achieve similar results by:
383
+ 1. Adding INVAR.md content to system prompts
384
+ 2. Manually configuring MCP servers (if supported)
385
+ 3. Using CLI commands for verification
386
+
387
+ ---
388
+
389
+ ## 📂 What Gets Installed
390
+
391
+ `invar init --claude` creates:
392
+
393
+ | File/Directory | Purpose | Editable? |
394
+ |----------------|---------|-----------|
395
+ | `INVAR.md` | Protocol for AI agents | No (managed) |
396
+ | `CLAUDE.md` | Project configuration | Yes |
397
+ | `.claude/skills/` | Workflow skills | Yes |
398
+ | `.claude/hooks/` | Tool call interception | Yes |
399
+ | `.invar/examples/` | Reference patterns | No (managed) |
400
+ | `.invar/context.md` | Project state, lessons | Yes |
401
+ | `pyproject.toml` | `[tool.invar]` section | Yes |
402
+
403
+ **Recommended structure:**
404
+
405
+ ```
406
+ src/{project}/
407
+ ├── core/ # Pure logic (@pre/@post, doctests, no I/O)
408
+ └── shell/ # I/O operations (Result[T, E] returns)
409
+ ```
410
+
411
+ ---
412
+
413
+ ## ⚙️ Configuration
414
+
415
+ ```toml
416
+ # pyproject.toml
417
+
418
+ [tool.invar.guard]
419
+ # Option 1: Explicit paths
420
+ core_paths = ["src/myapp/core"]
421
+ shell_paths = ["src/myapp/shell"]
422
+
423
+ # Option 2: Pattern matching (for existing projects)
424
+ core_patterns = ["**/domain/**", "**/models/**"]
425
+ shell_patterns = ["**/api/**", "**/cli/**"]
426
+
427
+ # Option 3: Auto-detection (when no paths/patterns specified)
428
+ # - Default paths: src/core, core, src/shell, shell
429
+ # - Content analysis: @pre/@post → Core, Result → Shell
430
+
431
+ # Size limits
432
+ max_file_lines = 500
433
+ max_function_lines = 50
434
+
435
+ # Requirements
436
+ require_contracts = true
437
+ require_doctests = true
438
+ ```
439
+
440
+ ### 🚪 Escape Hatches
441
+
442
+ For code that intentionally breaks rules:
443
+
444
+ ```toml
445
+ # Exclude entire directories
446
+ [[tool.invar.guard.rule_exclusions]]
447
+ pattern = "**/generated/**"
448
+ rules = ["*"]
449
+
450
+ # Exclude specific rules for specific files
451
+ [[tool.invar.guard.rule_exclusions]]
452
+ pattern = "**/legacy_api.py"
453
+ rules = ["missing_contract", "shell_result"]
454
+ ```
455
+
456
+ ---
457
+
458
+ ## 🔧 Tool Reference
459
+
460
+ ### CLI Commands
461
+
462
+ | Command | Purpose |
463
+ |---------|---------|
464
+ | `invar guard` | Full verification (static + doctest + property + symbolic) |
465
+ | `invar guard --changed` | Only git-modified files |
466
+ | `invar guard --static` | Static analysis only (~0.5s) |
467
+ | `invar init` | Initialize or update project |
468
+ | `invar sig <file>` | Show signatures and contracts |
469
+ | `invar map` | Symbol map with reference counts |
470
+ | `invar rules` | List all rules |
471
+ | `invar test` | Property-based tests (Hypothesis) |
472
+ | `invar verify` | Symbolic verification (CrossHair) |
473
+ | `invar hooks` | Manage Claude Code hooks |
474
+
475
+ ### MCP Tools
476
+
477
+ | Tool | Purpose |
478
+ |------|---------|
479
+ | `invar_guard` | Smart multi-layer verification |
480
+ | `invar_sig` | Extract signatures and contracts |
481
+ | `invar_map` | Symbol map with reference counts |
482
+
483
+ ---
484
+
485
+ ## 📚 Learn More
486
+
487
+ **Created by `invar init`:**
488
+ - `INVAR.md` — Protocol v5.0
489
+ - `.invar/examples/` — Reference patterns
490
+
491
+ **Documentation:**
492
+ - [Vision & Philosophy](./docs/vision.md)
493
+ - [Technical Design](./docs/design.md)
494
+
495
+ ---
496
+
497
+ ## 📄 License
498
+
499
+ | Component | License | Notes |
500
+ |-----------|---------|-------|
501
+ | **invar-runtime** | [Apache-2.0](LICENSE) | Use freely in any project |
502
+ | **invar-tools** | [GPL-3.0](LICENSE-GPL) | Improvements must be shared |
503
+ | **Documentation** | [CC-BY-4.0](https://creativecommons.org/licenses/by/4.0/) | Share with attribution |
504
+
505
+ See [NOTICE](NOTICE) for third-party licenses.