skillware 0.5.2__tar.gz → 0.5.3__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 (220) hide show
  1. {skillware-0.5.2/skillware.egg-info → skillware-0.5.3}/PKG-INFO +18 -16
  2. {skillware-0.5.2 → skillware-0.5.3}/README.md +16 -15
  3. {skillware-0.5.2 → skillware-0.5.3}/pyproject.toml +3 -1
  4. {skillware-0.5.2 → skillware-0.5.3}/skills/creative/bg_remover/card.json +1 -1
  5. {skillware-0.5.2 → skillware-0.5.3}/skills/creative/bg_remover/manifest.yaml +1 -1
  6. {skillware-0.5.2 → skillware-0.5.3}/skills/data_engineering/novelty_extractor/card.json +3 -2
  7. {skillware-0.5.2 → skillware-0.5.3}/skills/data_engineering/novelty_extractor/manifest.yaml +1 -1
  8. skillware-0.5.3/skills/monitoring/kpi_gate/__init__.py +5 -0
  9. skillware-0.5.3/skills/monitoring/kpi_gate/card.json +33 -0
  10. skillware-0.5.3/skills/monitoring/kpi_gate/fixtures/benchmarks_missing_ref.json +11 -0
  11. skillware-0.5.3/skills/monitoring/kpi_gate/fixtures/charter_floor_boundary.yaml +10 -0
  12. skillware-0.5.3/skills/monitoring/kpi_gate/fixtures/example_charter.yaml +19 -0
  13. skillware-0.5.3/skills/monitoring/kpi_gate/fixtures/example_snapshot.json +13 -0
  14. skillware-0.5.3/skills/monitoring/kpi_gate/fixtures/expected_findings.json +24 -0
  15. skillware-0.5.3/skills/monitoring/kpi_gate/fixtures/invalid_benchmarks_schema.json +9 -0
  16. skillware-0.5.3/skills/monitoring/kpi_gate/fixtures/invalid_charter_dependent_required.yaml +9 -0
  17. skillware-0.5.3/skills/monitoring/kpi_gate/fixtures/invalid_charter_schema.yaml +8 -0
  18. skillware-0.5.3/skills/monitoring/kpi_gate/fixtures/invalid_charter_unknown_denominator.yaml +9 -0
  19. skillware-0.5.3/skills/monitoring/kpi_gate/fixtures/invalid_charter_unknown_rule_metric.yaml +8 -0
  20. skillware-0.5.3/skills/monitoring/kpi_gate/fixtures/invalid_snapshot_schema.json +5 -0
  21. skillware-0.5.3/skills/monitoring/kpi_gate/fixtures/snapshot_empty_metrics.json +5 -0
  22. skillware-0.5.3/skills/monitoring/kpi_gate/fixtures/snapshot_floor_at_min.json +5 -0
  23. skillware-0.5.3/skills/monitoring/kpi_gate/fixtures/snapshot_floor_below_min.json +5 -0
  24. skillware-0.5.3/skills/monitoring/kpi_gate/fixtures/snapshot_unknown_key.json +14 -0
  25. skillware-0.5.3/skills/monitoring/kpi_gate/instructions.md +97 -0
  26. skillware-0.5.3/skills/monitoring/kpi_gate/kb/benchmarks_demo.json +15 -0
  27. skillware-0.5.3/skills/monitoring/kpi_gate/manifest.yaml +67 -0
  28. skillware-0.5.3/skills/monitoring/kpi_gate/schemas/benchmarks.schema.json +25 -0
  29. skillware-0.5.3/skills/monitoring/kpi_gate/schemas/metrics.schema.json +26 -0
  30. skillware-0.5.3/skills/monitoring/kpi_gate/schemas/policy.schema.json +52 -0
  31. skillware-0.5.3/skills/monitoring/kpi_gate/skill.py +565 -0
  32. skillware-0.5.3/skills/monitoring/kpi_gate/test_skill.py +491 -0
  33. {skillware-0.5.2 → skillware-0.5.3}/skills/security/prompt_injection_firewall/card.json +1 -1
  34. {skillware-0.5.2 → skillware-0.5.3}/skills/security/prompt_injection_firewall/manifest.yaml +1 -1
  35. {skillware-0.5.2 → skillware-0.5.3/skillware.egg-info}/PKG-INFO +18 -16
  36. {skillware-0.5.2 → skillware-0.5.3}/skillware.egg-info/SOURCES.txt +26 -0
  37. {skillware-0.5.2 → skillware-0.5.3}/skillware.egg-info/requires.txt +2 -0
  38. {skillware-0.5.2 → skillware-0.5.3}/tests/test_discovery.py +31 -1
  39. skillware-0.5.3/tests/test_examples_smoke.py +166 -0
  40. {skillware-0.5.2 → skillware-0.5.3}/tests/test_loader.py +49 -1
  41. {skillware-0.5.2 → skillware-0.5.3}/tests/test_version_policy.py +1 -1
  42. {skillware-0.5.2 → skillware-0.5.3}/LICENSE +0 -0
  43. {skillware-0.5.2 → skillware-0.5.3}/MANIFEST.in +0 -0
  44. {skillware-0.5.2 → skillware-0.5.3}/setup.cfg +0 -0
  45. {skillware-0.5.2 → skillware-0.5.3}/skills/__init__.py +0 -0
  46. {skillware-0.5.2 → skillware-0.5.3}/skills/compliance/__init__.py +0 -0
  47. {skillware-0.5.2 → skillware-0.5.3}/skills/compliance/mica_module/__init__.py +0 -0
  48. {skillware-0.5.2 → skillware-0.5.3}/skills/compliance/mica_module/card.json +0 -0
  49. {skillware-0.5.2 → skillware-0.5.3}/skills/compliance/mica_module/instructions.md +0 -0
  50. {skillware-0.5.2 → skillware-0.5.3}/skills/compliance/mica_module/manifest.yaml +0 -0
  51. {skillware-0.5.2 → skillware-0.5.3}/skills/compliance/mica_module/mica_corpus.json +0 -0
  52. {skillware-0.5.2 → skillware-0.5.3}/skills/compliance/mica_module/skill.py +0 -0
  53. {skillware-0.5.2 → skillware-0.5.3}/skills/compliance/mica_module/test_skill.py +0 -0
  54. {skillware-0.5.2 → skillware-0.5.3}/skills/compliance/pii_masker/__init__.py +0 -0
  55. {skillware-0.5.2 → skillware-0.5.3}/skills/compliance/pii_masker/card.json +0 -0
  56. {skillware-0.5.2 → skillware-0.5.3}/skills/compliance/pii_masker/instructions.md +0 -0
  57. {skillware-0.5.2 → skillware-0.5.3}/skills/compliance/pii_masker/manifest.yaml +0 -0
  58. {skillware-0.5.2 → skillware-0.5.3}/skills/compliance/pii_masker/skill.py +0 -0
  59. {skillware-0.5.2 → skillware-0.5.3}/skills/compliance/pii_masker/test_skill.py +0 -0
  60. {skillware-0.5.2 → skillware-0.5.3}/skills/compliance/tos_evaluator/__init__.py +0 -0
  61. {skillware-0.5.2 → skillware-0.5.3}/skills/compliance/tos_evaluator/card.json +0 -0
  62. {skillware-0.5.2 → skillware-0.5.3}/skills/compliance/tos_evaluator/instructions.md +0 -0
  63. {skillware-0.5.2 → skillware-0.5.3}/skills/compliance/tos_evaluator/manifest.yaml +0 -0
  64. {skillware-0.5.2 → skillware-0.5.3}/skills/compliance/tos_evaluator/skill.py +0 -0
  65. {skillware-0.5.2 → skillware-0.5.3}/skills/compliance/tos_evaluator/test_skill.py +0 -0
  66. {skillware-0.5.2 → skillware-0.5.3}/skills/creative/__init__.py +0 -0
  67. {skillware-0.5.2 → skillware-0.5.3}/skills/creative/bg_remover/__init__.py +0 -0
  68. {skillware-0.5.2 → skillware-0.5.3}/skills/creative/bg_remover/instructions.md +0 -0
  69. {skillware-0.5.2 → skillware-0.5.3}/skills/creative/bg_remover/skill.py +0 -0
  70. {skillware-0.5.2 → skillware-0.5.3}/skills/creative/bg_remover/test_skill.py +0 -0
  71. {skillware-0.5.2 → skillware-0.5.3}/skills/data_engineering/__init__.py +0 -0
  72. {skillware-0.5.2 → skillware-0.5.3}/skills/data_engineering/novelty_extractor/__init__.py +0 -0
  73. {skillware-0.5.2 → skillware-0.5.3}/skills/data_engineering/novelty_extractor/instructions.md +0 -0
  74. {skillware-0.5.2 → skillware-0.5.3}/skills/data_engineering/novelty_extractor/skill.py +0 -0
  75. {skillware-0.5.2 → skillware-0.5.3}/skills/data_engineering/novelty_extractor/test_skill.py +0 -0
  76. {skillware-0.5.2 → skillware-0.5.3}/skills/data_engineering/synthetic_generator/__init__.py +0 -0
  77. {skillware-0.5.2 → skillware-0.5.3}/skills/data_engineering/synthetic_generator/card.json +0 -0
  78. {skillware-0.5.2 → skillware-0.5.3}/skills/data_engineering/synthetic_generator/instructions.md +0 -0
  79. {skillware-0.5.2 → skillware-0.5.3}/skills/data_engineering/synthetic_generator/manifest.yaml +0 -0
  80. {skillware-0.5.2 → skillware-0.5.3}/skills/data_engineering/synthetic_generator/skill.py +0 -0
  81. {skillware-0.5.2 → skillware-0.5.3}/skills/data_engineering/synthetic_generator/test_skill.py +0 -0
  82. {skillware-0.5.2 → skillware-0.5.3}/skills/defi/__init__.py +0 -0
  83. {skillware-0.5.2 → skillware-0.5.3}/skills/defi/evm_tx_handler/__init__.py +0 -0
  84. {skillware-0.5.2 → skillware-0.5.3}/skills/defi/evm_tx_handler/abis.py +0 -0
  85. {skillware-0.5.2 → skillware-0.5.3}/skills/defi/evm_tx_handler/card.json +0 -0
  86. {skillware-0.5.2 → skillware-0.5.3}/skills/defi/evm_tx_handler/config.yaml.example +0 -0
  87. {skillware-0.5.2 → skillware-0.5.3}/skills/defi/evm_tx_handler/data/addressbook.yaml +0 -0
  88. {skillware-0.5.2 → skillware-0.5.3}/skills/defi/evm_tx_handler/data/chains.yaml +0 -0
  89. {skillware-0.5.2 → skillware-0.5.3}/skills/defi/evm_tx_handler/data/tokens.yaml +0 -0
  90. {skillware-0.5.2 → skillware-0.5.3}/skills/defi/evm_tx_handler/instructions.md +0 -0
  91. {skillware-0.5.2 → skillware-0.5.3}/skills/defi/evm_tx_handler/manifest.yaml +0 -0
  92. {skillware-0.5.2 → skillware-0.5.3}/skills/defi/evm_tx_handler/skill.py +0 -0
  93. {skillware-0.5.2 → skillware-0.5.3}/skills/defi/evm_tx_handler/test_skill.py +0 -0
  94. {skillware-0.5.2 → skillware-0.5.3}/skills/dev_tools/__init__.py +0 -0
  95. {skillware-0.5.2 → skillware-0.5.3}/skills/dev_tools/issue_resolver/__init__.py +0 -0
  96. {skillware-0.5.2 → skillware-0.5.3}/skills/dev_tools/issue_resolver/card.json +0 -0
  97. {skillware-0.5.2 → skillware-0.5.3}/skills/dev_tools/issue_resolver/instructions.md +0 -0
  98. {skillware-0.5.2 → skillware-0.5.3}/skills/dev_tools/issue_resolver/manifest.yaml +0 -0
  99. {skillware-0.5.2 → skillware-0.5.3}/skills/dev_tools/issue_resolver/skill.py +0 -0
  100. {skillware-0.5.2 → skillware-0.5.3}/skills/dev_tools/issue_resolver/test_skill.py +0 -0
  101. {skillware-0.5.2 → skillware-0.5.3}/skills/dev_tools/issue_resolver/workflow.py +0 -0
  102. {skillware-0.5.2 → skillware-0.5.3}/skills/finance/__init__.py +0 -0
  103. {skillware-0.5.2 → skillware-0.5.3}/skills/finance/uk_companies_house_handler/__init__.py +0 -0
  104. {skillware-0.5.2 → skillware-0.5.3}/skills/finance/uk_companies_house_handler/card.json +0 -0
  105. {skillware-0.5.2 → skillware-0.5.3}/skills/finance/uk_companies_house_handler/data/api_index.json +0 -0
  106. {skillware-0.5.2 → skillware-0.5.3}/skills/finance/uk_companies_house_handler/data/terminology_map.yaml +0 -0
  107. {skillware-0.5.2 → skillware-0.5.3}/skills/finance/uk_companies_house_handler/instructions.md +0 -0
  108. {skillware-0.5.2 → skillware-0.5.3}/skills/finance/uk_companies_house_handler/manifest.yaml +0 -0
  109. {skillware-0.5.2 → skillware-0.5.3}/skills/finance/uk_companies_house_handler/skill.py +0 -0
  110. {skillware-0.5.2 → skillware-0.5.3}/skills/finance/uk_companies_house_handler/test_skill.py +0 -0
  111. {skillware-0.5.2 → skillware-0.5.3}/skills/finance/wallet_screening/__init__.py +0 -0
  112. {skillware-0.5.2 → skillware-0.5.3}/skills/finance/wallet_screening/card.json +0 -0
  113. {skillware-0.5.2 → skillware-0.5.3}/skills/finance/wallet_screening/data/entities.ftm.json +0 -0
  114. {skillware-0.5.2 → skillware-0.5.3}/skills/finance/wallet_screening/data/malicious_scs_2025.json +0 -0
  115. {skillware-0.5.2 → skillware-0.5.3}/skills/finance/wallet_screening/data/normalized_fbi_lazarus_20250722_180019.json +0 -0
  116. {skillware-0.5.2 → skillware-0.5.3}/skills/finance/wallet_screening/data/normalized_israel_nbctf_20250722_180019.json +0 -0
  117. {skillware-0.5.2 → skillware-0.5.3}/skills/finance/wallet_screening/data/normalized_uniswap_trm.json +0 -0
  118. {skillware-0.5.2 → skillware-0.5.3}/skills/finance/wallet_screening/instructions.md +0 -0
  119. {skillware-0.5.2 → skillware-0.5.3}/skills/finance/wallet_screening/maintenance/normalization_tool.py +0 -0
  120. {skillware-0.5.2 → skillware-0.5.3}/skills/finance/wallet_screening/maintenance/normalize_uniswap_trm.py +0 -0
  121. {skillware-0.5.2 → skillware-0.5.3}/skills/finance/wallet_screening/manifest.yaml +0 -0
  122. {skillware-0.5.2 → skillware-0.5.3}/skills/finance/wallet_screening/skill.py +0 -0
  123. {skillware-0.5.2 → skillware-0.5.3}/skills/finance/wallet_screening/test_skill.py +0 -0
  124. {skillware-0.5.2 → skillware-0.5.3}/skills/monitoring/__init__.py +0 -0
  125. {skillware-0.5.2 → skillware-0.5.3}/skills/monitoring/token_limiter/__init__.py +0 -0
  126. {skillware-0.5.2 → skillware-0.5.3}/skills/monitoring/token_limiter/budget.py +0 -0
  127. {skillware-0.5.2 → skillware-0.5.3}/skills/monitoring/token_limiter/card.json +0 -0
  128. {skillware-0.5.2 → skillware-0.5.3}/skills/monitoring/token_limiter/data/model_pricing.json +0 -0
  129. {skillware-0.5.2 → skillware-0.5.3}/skills/monitoring/token_limiter/instructions.md +0 -0
  130. {skillware-0.5.2 → skillware-0.5.3}/skills/monitoring/token_limiter/manifest.yaml +0 -0
  131. {skillware-0.5.2 → skillware-0.5.3}/skills/monitoring/token_limiter/skill.py +0 -0
  132. {skillware-0.5.2 → skillware-0.5.3}/skills/monitoring/token_limiter/test_skill.py +0 -0
  133. {skillware-0.5.2 → skillware-0.5.3}/skills/office/__init__.py +0 -0
  134. {skillware-0.5.2 → skillware-0.5.3}/skills/office/gmail_handler/__init__.py +0 -0
  135. {skillware-0.5.2 → skillware-0.5.3}/skills/office/gmail_handler/addressbook.py +0 -0
  136. {skillware-0.5.2 → skillware-0.5.3}/skills/office/gmail_handler/attachments.py +0 -0
  137. {skillware-0.5.2 → skillware-0.5.3}/skills/office/gmail_handler/card.json +0 -0
  138. {skillware-0.5.2 → skillware-0.5.3}/skills/office/gmail_handler/data/.gitignore +0 -0
  139. {skillware-0.5.2 → skillware-0.5.3}/skills/office/gmail_handler/data/addressbook.yaml +0 -0
  140. {skillware-0.5.2 → skillware-0.5.3}/skills/office/gmail_handler/data/config.yaml.example +0 -0
  141. {skillware-0.5.2 → skillware-0.5.3}/skills/office/gmail_handler/file_ref.py +0 -0
  142. {skillware-0.5.2 → skillware-0.5.3}/skills/office/gmail_handler/instructions.md +0 -0
  143. {skillware-0.5.2 → skillware-0.5.3}/skills/office/gmail_handler/mail.py +0 -0
  144. {skillware-0.5.2 → skillware-0.5.3}/skills/office/gmail_handler/manifest.yaml +0 -0
  145. {skillware-0.5.2 → skillware-0.5.3}/skills/office/gmail_handler/skill.py +0 -0
  146. {skillware-0.5.2 → skillware-0.5.3}/skills/office/gmail_handler/test_skill.py +0 -0
  147. {skillware-0.5.2 → skillware-0.5.3}/skills/office/pdf_form_filler/__init__.py +0 -0
  148. {skillware-0.5.2 → skillware-0.5.3}/skills/office/pdf_form_filler/card.json +0 -0
  149. {skillware-0.5.2 → skillware-0.5.3}/skills/office/pdf_form_filler/instructions.md +0 -0
  150. {skillware-0.5.2 → skillware-0.5.3}/skills/office/pdf_form_filler/manifest.yaml +0 -0
  151. {skillware-0.5.2 → skillware-0.5.3}/skills/office/pdf_form_filler/skill.py +0 -0
  152. {skillware-0.5.2 → skillware-0.5.3}/skills/office/pdf_form_filler/test_skill.py +0 -0
  153. {skillware-0.5.2 → skillware-0.5.3}/skills/office/pdf_form_filler/utils.py +0 -0
  154. {skillware-0.5.2 → skillware-0.5.3}/skills/optimization/__init__.py +0 -0
  155. {skillware-0.5.2 → skillware-0.5.3}/skills/optimization/prompt_rewriter/__init__.py +0 -0
  156. {skillware-0.5.2 → skillware-0.5.3}/skills/optimization/prompt_rewriter/card.json +0 -0
  157. {skillware-0.5.2 → skillware-0.5.3}/skills/optimization/prompt_rewriter/instructions.md +0 -0
  158. {skillware-0.5.2 → skillware-0.5.3}/skills/optimization/prompt_rewriter/manifest.yaml +0 -0
  159. {skillware-0.5.2 → skillware-0.5.3}/skills/optimization/prompt_rewriter/skill.py +0 -0
  160. {skillware-0.5.2 → skillware-0.5.3}/skills/optimization/prompt_rewriter/test_skill.py +0 -0
  161. {skillware-0.5.2 → skillware-0.5.3}/skills/security/__init__.py +0 -0
  162. {skillware-0.5.2 → skillware-0.5.3}/skills/security/deceptive_ui_guard/__init__.py +0 -0
  163. {skillware-0.5.2 → skillware-0.5.3}/skills/security/deceptive_ui_guard/card.json +0 -0
  164. {skillware-0.5.2 → skillware-0.5.3}/skills/security/deceptive_ui_guard/guard.py +0 -0
  165. {skillware-0.5.2 → skillware-0.5.3}/skills/security/deceptive_ui_guard/instructions.md +0 -0
  166. {skillware-0.5.2 → skillware-0.5.3}/skills/security/deceptive_ui_guard/kb/deception_lexicon.json +0 -0
  167. {skillware-0.5.2 → skillware-0.5.3}/skills/security/deceptive_ui_guard/manifest.yaml +0 -0
  168. {skillware-0.5.2 → skillware-0.5.3}/skills/security/deceptive_ui_guard/skill.py +0 -0
  169. {skillware-0.5.2 → skillware-0.5.3}/skills/security/deceptive_ui_guard/test_skill.py +0 -0
  170. {skillware-0.5.2 → skillware-0.5.3}/skills/security/prompt_injection_firewall/__init__.py +0 -0
  171. {skillware-0.5.2 → skillware-0.5.3}/skills/security/prompt_injection_firewall/firewall.py +0 -0
  172. {skillware-0.5.2 → skillware-0.5.3}/skills/security/prompt_injection_firewall/instructions.md +0 -0
  173. {skillware-0.5.2 → skillware-0.5.3}/skills/security/prompt_injection_firewall/kb/confusables.json +0 -0
  174. {skillware-0.5.2 → skillware-0.5.3}/skills/security/prompt_injection_firewall/kb/injection_patterns.json +0 -0
  175. {skillware-0.5.2 → skillware-0.5.3}/skills/security/prompt_injection_firewall/skill.py +0 -0
  176. {skillware-0.5.2 → skillware-0.5.3}/skills/security/prompt_injection_firewall/test_skill.py +0 -0
  177. {skillware-0.5.2 → skillware-0.5.3}/skills/wellness/__init__.py +0 -0
  178. {skillware-0.5.2 → skillware-0.5.3}/skills/wellness/mental_coach/__init__.py +0 -0
  179. {skillware-0.5.2 → skillware-0.5.3}/skills/wellness/mental_coach/card.json +0 -0
  180. {skillware-0.5.2 → skillware-0.5.3}/skills/wellness/mental_coach/constraints.py +0 -0
  181. {skillware-0.5.2 → skillware-0.5.3}/skills/wellness/mental_coach/crisis_gate.py +0 -0
  182. {skillware-0.5.2 → skillware-0.5.3}/skills/wellness/mental_coach/instructions.md +0 -0
  183. {skillware-0.5.2 → skillware-0.5.3}/skills/wellness/mental_coach/kb/corpus.json +0 -0
  184. {skillware-0.5.2 → skillware-0.5.3}/skills/wellness/mental_coach/kb/crisis_resources.json +0 -0
  185. {skillware-0.5.2 → skillware-0.5.3}/skills/wellness/mental_coach/kb/hard_constraints.yaml +0 -0
  186. {skillware-0.5.2 → skillware-0.5.3}/skills/wellness/mental_coach/kb_provider.py +0 -0
  187. {skillware-0.5.2 → skillware-0.5.3}/skills/wellness/mental_coach/manifest.yaml +0 -0
  188. {skillware-0.5.2 → skillware-0.5.3}/skills/wellness/mental_coach/resources.py +0 -0
  189. {skillware-0.5.2 → skillware-0.5.3}/skills/wellness/mental_coach/skill.py +0 -0
  190. {skillware-0.5.2 → skillware-0.5.3}/skills/wellness/mental_coach/test_skill.py +0 -0
  191. {skillware-0.5.2 → skillware-0.5.3}/skillware/__init__.py +0 -0
  192. {skillware-0.5.2 → skillware-0.5.3}/skillware/__main__.py +0 -0
  193. {skillware-0.5.2 → skillware-0.5.3}/skillware/branding/skillware_logo.png +0 -0
  194. {skillware-0.5.2 → skillware-0.5.3}/skillware/cli.py +0 -0
  195. {skillware-0.5.2 → skillware-0.5.3}/skillware/cli_mail.py +0 -0
  196. {skillware-0.5.2 → skillware-0.5.3}/skillware/core/__init__.py +0 -0
  197. {skillware-0.5.2 → skillware-0.5.3}/skillware/core/base_skill.py +0 -0
  198. {skillware-0.5.2 → skillware-0.5.3}/skillware/core/config.py +0 -0
  199. {skillware-0.5.2 → skillware-0.5.3}/skillware/core/discovery.py +0 -0
  200. {skillware-0.5.2 → skillware-0.5.3}/skillware/core/env.py +0 -0
  201. {skillware-0.5.2 → skillware-0.5.3}/skillware/core/extras.py +0 -0
  202. {skillware-0.5.2 → skillware-0.5.3}/skillware/core/loader.py +0 -0
  203. {skillware-0.5.2 → skillware-0.5.3}/skillware/core/mail_config.py +0 -0
  204. {skillware-0.5.2 → skillware-0.5.3}/skillware/core/ui_schema.py +0 -0
  205. {skillware-0.5.2 → skillware-0.5.3}/skillware/version_policy.py +0 -0
  206. {skillware-0.5.2 → skillware-0.5.3}/skillware.egg-info/dependency_links.txt +0 -0
  207. {skillware-0.5.2 → skillware-0.5.3}/skillware.egg-info/entry_points.txt +0 -0
  208. {skillware-0.5.2 → skillware-0.5.3}/skillware.egg-info/top_level.txt +0 -0
  209. {skillware-0.5.2 → skillware-0.5.3}/tests/test_card_ui_schema.py +0 -0
  210. {skillware-0.5.2 → skillware-0.5.3}/tests/test_cli.py +0 -0
  211. {skillware-0.5.2 → skillware-0.5.3}/tests/test_config.py +0 -0
  212. {skillware-0.5.2 → skillware-0.5.3}/tests/test_extras_sync.py +0 -0
  213. {skillware-0.5.2 → skillware-0.5.3}/tests/test_github_labels.py +0 -0
  214. {skillware-0.5.2 → skillware-0.5.3}/tests/test_mail_config.py +0 -0
  215. {skillware-0.5.2 → skillware-0.5.3}/tests/test_registry_docs.py +0 -0
  216. {skillware-0.5.2 → skillware-0.5.3}/tests/test_registry_identity.py +0 -0
  217. {skillware-0.5.2 → skillware-0.5.3}/tests/test_requirements_check.py +0 -0
  218. {skillware-0.5.2 → skillware-0.5.3}/tests/test_skill_issuer.py +0 -0
  219. {skillware-0.5.2 → skillware-0.5.3}/tests/test_ui_schema.py +0 -0
  220. {skillware-0.5.2 → skillware-0.5.3}/tests/test_validate_params.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: skillware
3
- Version: 0.5.2
3
+ Version: 0.5.3
4
4
  Summary: A framework for modular, self-contained AI skills.
5
5
  Author-email: ARPA Hellenic Logical Systems <skillware-os@arpacorp.net>
6
6
  License: MIT License
@@ -105,6 +105,7 @@ Requires-Dist: web3>=6.0.0; extra == "defi-evm-tx-handler"
105
105
  Provides-Extra: dev-tools-issue-resolver
106
106
  Provides-Extra: finance-uk-companies-house-handler
107
107
  Provides-Extra: finance-wallet-screening
108
+ Provides-Extra: monitoring-kpi-gate
108
109
  Provides-Extra: monitoring-token-limiter
109
110
  Provides-Extra: office-gmail-handler
110
111
  Provides-Extra: office-pdf-form-filler
@@ -170,10 +171,13 @@ The AI ecosystem is fragmented. Developers often re-invent tool definitions, sys
170
171
 
171
172
  A **Skill** in this framework provides everything an Agent needs to master a domain:
172
173
 
173
- 1. **Logic**: Executable Python so agents run real work, not guess it.
174
- 2. **Cognition**: System instructions and cognitive maps so any logical system uses the capability as intended.
175
- 3. **Governance**: Constitution, safety boundaries, and hard limits baked into the bundle.
176
- 4. **Interface**: Standardized tool schemas for any LLM or agent runtime.
174
+ 1. **Contract**: Constitution, safety boundaries, and typed I/O baked into the bundle.
175
+ 2. **Effect**: Executable Python so agents run real work, not guess it.
176
+ 3. **Directive**: System instructions and cognitive maps so any host uses the capability as intended.
177
+ 4. **Assurance**: Offline tests that Effect honors Contract before a skill joins the registry.
178
+ 5. **Interface**: Standardized tool schemas for any LLM or agent runtime.
179
+
180
+ Optional **Corpus**, **Reference**, and **Presentation** assets extend bundles when needed. Full reference: [Introduction — Skill anatomy](docs/introduction.md#skill-anatomy).
177
181
 
178
182
  ### Skill library
179
183
 
@@ -184,12 +188,10 @@ Browse capabilities by category in the [Skill library](docs/skills/README.md) or
184
188
  ```mermaid
185
189
  flowchart LR
186
190
  Registry[Registry] -->|Load| Loader[Loader]
187
- Loader -->|Adapt| Host[Host]
188
- Host -->|Prompt + Tools| LogicalSystems([Logical Systems])
189
- LogicalSystems -->|Tool Call| Host
191
+ Loader -->|Adapt| AnyHost([Any Host])
190
192
  ```
191
193
 
192
- Install the registry once. Skillware loads a bundle and adapts it to your model's tool format — you run the loop. For details on how the loader turns the manifest into a tool, see the [Introduction](docs/introduction.md).
194
+ Install the registry once. Skillware loads a bundle, adapts it to your host's tool format, and your app runs the agent loop (Gemini, Claude, Ollama, custom scripts, …). For details on how the loader turns the manifest into a tool, see the [Introduction](docs/introduction.md).
193
195
 
194
196
  ## Architecture
195
197
 
@@ -204,11 +206,11 @@ Skillware/
204
206
  ├── skills/ # Skill Registry
205
207
  │ └── category/ # Domain boundaries (e.g., finance)
206
208
  │ └── skill_name/ # The Skill bundle
207
- │ ├── manifest.yaml # Definition, schema, and constitution
208
- │ ├── skill.py # Executable Python logic
209
- │ ├── instructions.md # Cognitive map for the LLM
210
- │ ├── card.json # Optional UI presentation metadata
211
- │ └── test_skill.py # Bundle test (required for new skills; see docs/TESTING.md)
209
+ │ ├── manifest.yaml # Contract: schema, constitution, issuer
210
+ │ ├── skill.py # Effect: deterministic execution
211
+ │ ├── instructions.md # Directive: host guidance
212
+ │ ├── card.json # Presentation (optional)
213
+ │ └── test_skill.py # Assurance (required for registry skills)
212
214
  ├── skillware/ # Core Framework Package
213
215
  │ ├── cli.py # Command-line interface
214
216
  │ └── core/
@@ -315,7 +317,7 @@ skill = skill_bundle["class"](
315
317
  # 2. Client & Tool Setup
316
318
  client = genai.Client()
317
319
  tool = SkillLoader.to_gemini_tool(skill_bundle) # The "Adapter"
318
- system_instruction = skill_bundle['instructions'] # The "Mind"
320
+ system_instruction = skill_bundle['instructions'] # Directive
319
321
 
320
322
  # 3. Agent Loop
321
323
  response = client.models.generate_content(
@@ -392,7 +394,7 @@ PyPI download counts show how often `skillware` is installed from the package in
392
394
 
393
395
  <a href="https://doi.org/10.5281/zenodo.21552745"><img src="https://img.shields.io/badge/DOI-10.5281%2Fzenodo.21552745-c7d2fe?style=flat-square" alt="DOI 10.5281/zenodo.21552745"></a>
394
396
 
395
- If you use Skillware in research or products, please cite it using [CITATION.cff](CITATION.cff) (GitHub **Cite this repository**) or the Zenodo **concept DOI** above. That DOI is stable across releases. For reproducibility, also record the **Skillware version** you used (PyPI or Git tag, for example `0.5.2`).
397
+ If you use Skillware in research or products, please cite it using [CITATION.cff](CITATION.cff) (GitHub **Cite this repository**) or the Zenodo **concept DOI** above. That DOI is stable across releases. For reproducibility, also record the **Skillware version** you used (PyPI or Git tag, for example `0.5.3`).
396
398
 
397
399
  ## Contact
398
400
 
@@ -41,10 +41,13 @@ The AI ecosystem is fragmented. Developers often re-invent tool definitions, sys
41
41
 
42
42
  A **Skill** in this framework provides everything an Agent needs to master a domain:
43
43
 
44
- 1. **Logic**: Executable Python so agents run real work, not guess it.
45
- 2. **Cognition**: System instructions and cognitive maps so any logical system uses the capability as intended.
46
- 3. **Governance**: Constitution, safety boundaries, and hard limits baked into the bundle.
47
- 4. **Interface**: Standardized tool schemas for any LLM or agent runtime.
44
+ 1. **Contract**: Constitution, safety boundaries, and typed I/O baked into the bundle.
45
+ 2. **Effect**: Executable Python so agents run real work, not guess it.
46
+ 3. **Directive**: System instructions and cognitive maps so any host uses the capability as intended.
47
+ 4. **Assurance**: Offline tests that Effect honors Contract before a skill joins the registry.
48
+ 5. **Interface**: Standardized tool schemas for any LLM or agent runtime.
49
+
50
+ Optional **Corpus**, **Reference**, and **Presentation** assets extend bundles when needed. Full reference: [Introduction — Skill anatomy](docs/introduction.md#skill-anatomy).
48
51
 
49
52
  ### Skill library
50
53
 
@@ -55,12 +58,10 @@ Browse capabilities by category in the [Skill library](docs/skills/README.md) or
55
58
  ```mermaid
56
59
  flowchart LR
57
60
  Registry[Registry] -->|Load| Loader[Loader]
58
- Loader -->|Adapt| Host[Host]
59
- Host -->|Prompt + Tools| LogicalSystems([Logical Systems])
60
- LogicalSystems -->|Tool Call| Host
61
+ Loader -->|Adapt| AnyHost([Any Host])
61
62
  ```
62
63
 
63
- Install the registry once. Skillware loads a bundle and adapts it to your model's tool format — you run the loop. For details on how the loader turns the manifest into a tool, see the [Introduction](docs/introduction.md).
64
+ Install the registry once. Skillware loads a bundle, adapts it to your host's tool format, and your app runs the agent loop (Gemini, Claude, Ollama, custom scripts, …). For details on how the loader turns the manifest into a tool, see the [Introduction](docs/introduction.md).
64
65
 
65
66
  ## Architecture
66
67
 
@@ -75,11 +76,11 @@ Skillware/
75
76
  ├── skills/ # Skill Registry
76
77
  │ └── category/ # Domain boundaries (e.g., finance)
77
78
  │ └── skill_name/ # The Skill bundle
78
- │ ├── manifest.yaml # Definition, schema, and constitution
79
- │ ├── skill.py # Executable Python logic
80
- │ ├── instructions.md # Cognitive map for the LLM
81
- │ ├── card.json # Optional UI presentation metadata
82
- │ └── test_skill.py # Bundle test (required for new skills; see docs/TESTING.md)
79
+ │ ├── manifest.yaml # Contract: schema, constitution, issuer
80
+ │ ├── skill.py # Effect: deterministic execution
81
+ │ ├── instructions.md # Directive: host guidance
82
+ │ ├── card.json # Presentation (optional)
83
+ │ └── test_skill.py # Assurance (required for registry skills)
83
84
  ├── skillware/ # Core Framework Package
84
85
  │ ├── cli.py # Command-line interface
85
86
  │ └── core/
@@ -186,7 +187,7 @@ skill = skill_bundle["class"](
186
187
  # 2. Client & Tool Setup
187
188
  client = genai.Client()
188
189
  tool = SkillLoader.to_gemini_tool(skill_bundle) # The "Adapter"
189
- system_instruction = skill_bundle['instructions'] # The "Mind"
190
+ system_instruction = skill_bundle['instructions'] # Directive
190
191
 
191
192
  # 3. Agent Loop
192
193
  response = client.models.generate_content(
@@ -263,7 +264,7 @@ PyPI download counts show how often `skillware` is installed from the package in
263
264
 
264
265
  <a href="https://doi.org/10.5281/zenodo.21552745"><img src="https://img.shields.io/badge/DOI-10.5281%2Fzenodo.21552745-c7d2fe?style=flat-square" alt="DOI 10.5281/zenodo.21552745"></a>
265
266
 
266
- If you use Skillware in research or products, please cite it using [CITATION.cff](CITATION.cff) (GitHub **Cite this repository**) or the Zenodo **concept DOI** above. That DOI is stable across releases. For reproducibility, also record the **Skillware version** you used (PyPI or Git tag, for example `0.5.2`).
267
+ If you use Skillware in research or products, please cite it using [CITATION.cff](CITATION.cff) (GitHub **Cite this repository**) or the Zenodo **concept DOI** above. That DOI is stable across releases. For reproducibility, also record the **Skillware version** you used (PyPI or Git tag, for example `0.5.3`).
267
268
 
268
269
  ## Contact
269
270
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "skillware"
7
- version = "0.5.2"
7
+ version = "0.5.3"
8
8
  description = "A framework for modular, self-contained AI skills."
9
9
  readme = "README.md"
10
10
  authors = [
@@ -140,6 +140,8 @@ finance_uk_companies_house_handler = []
140
140
 
141
141
  finance_wallet_screening = []
142
142
 
143
+ monitoring_kpi_gate = []
144
+
143
145
  monitoring_token_limiter = []
144
146
 
145
147
  office_gmail_handler = []
@@ -5,7 +5,7 @@
5
5
  "name": "Ayush Srivastava",
6
6
  "email": "ayush.sri0705@gmail.com",
7
7
  "github": "AyushSrivastava1818",
8
- "org": ""
8
+ "org": "ARPAHLS"
9
9
  },
10
10
  "icon": "photo",
11
11
  "color": "violet",
@@ -7,7 +7,7 @@ issuer:
7
7
  name: Ayush Srivastava
8
8
  email: "ayush.sri0705@gmail.com"
9
9
  github: AyushSrivastava1818
10
- org: ""
10
+ org: ARPAHLS
11
11
 
12
12
  category: "creative"
13
13
 
@@ -32,6 +32,7 @@
32
32
  "issuer": {
33
33
  "name": "Martin Rizzo Lozano",
34
34
  "email": "rizzolozanomartin@gmail.com",
35
- "github": "rizzoMartin"
35
+ "github": "rizzoMartin",
36
+ "org": "ARPAHLS"
36
37
  }
37
- }
38
+ }
@@ -6,7 +6,7 @@ issuer:
6
6
  name: Martin Rizzo Lozano
7
7
  email: rizzolozanomartin@gmail.com
8
8
  github: rizzoMartin
9
- org: ""
9
+ org: ARPAHLS
10
10
  parameters:
11
11
  type: object
12
12
  properties:
@@ -0,0 +1,5 @@
1
+ # Deterministic business-KPI gate skill package.
2
+
3
+ from .skill import KpiGateSkill
4
+
5
+ __all__ = ["KpiGateSkill"]
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "KPI Gate",
3
+ "description": "Deterministic business-KPI gate: metrics snapshot vs policy charter with fail-closed findings.",
4
+ "issuer": {
5
+ "name": "Masa",
6
+ "email": "masa88keith@gmail.com",
7
+ "github": "mrmasa88",
8
+ "org": "AO"
9
+ },
10
+ "icon": "gauge",
11
+ "color": "#0f766e",
12
+ "ui_schema": {
13
+ "type": "card",
14
+ "fields": [
15
+ {
16
+ "key": "status",
17
+ "label": "Status"
18
+ },
19
+ {
20
+ "key": "policy_id",
21
+ "label": "Policy"
22
+ },
23
+ {
24
+ "key": "benchmark_version",
25
+ "label": "Benchmark Version"
26
+ },
27
+ {
28
+ "key": "findings",
29
+ "label": "Findings"
30
+ }
31
+ ]
32
+ }
33
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "schema_version": 1,
3
+ "benchmark_version": "demo-missing-ref",
4
+ "as_of": "2026-08-01",
5
+ "sources": [
6
+ "https://github.com/ARPAHLS/skillware/issues/317"
7
+ ],
8
+ "values": {
9
+ "some_other_benchmark_pct": {"value": 10.0, "unit": "pct"}
10
+ }
11
+ }
@@ -0,0 +1,10 @@
1
+ schema_version: 2
2
+ policy_id: floor_boundary_demo
3
+ metrics: [replies, reply_to_booking_rate_pct]
4
+ rules:
5
+ - id: BOOKING_CONVERSION_TRACKED
6
+ metric: reply_to_booking_rate_pct
7
+ check: {op: gte, threshold: 10}
8
+ severity: warning
9
+ requires: {denominator_metric: replies, min_denominator: 25,
10
+ granularity: weekly, reason_code: cohort_attribution_unavailable}
@@ -0,0 +1,19 @@
1
+ schema_version: 2
2
+ policy_id: coaching_funnel_demo_v1
3
+ metrics: [outreach_sends, replies, bookings, lp_sessions, downloads,
4
+ download_rate_pct, reply_to_booking_rate_pct]
5
+ rules:
6
+ - id: NO_BOOKING
7
+ metric: bookings
8
+ check: {op: gte, threshold: 1}
9
+ severity: error
10
+ - id: DOWNLOAD_RATE_BELOW_DOCTRINE
11
+ metric: download_rate_pct
12
+ check: {op: gte, benchmark_ref: lead_magnet_download_rate_pct}
13
+ severity: warning
14
+ - id: BOOKING_CONVERSION_TRACKED
15
+ metric: reply_to_booking_rate_pct
16
+ check: {op: gte, threshold: 10}
17
+ severity: warning
18
+ requires: {denominator_metric: replies, min_denominator: 25,
19
+ granularity: weekly, reason_code: cohort_attribution_unavailable}
@@ -0,0 +1,13 @@
1
+ {
2
+ "schema_version": 1,
3
+ "period": {"start": "2026-08-17", "end": "2026-08-23", "granularity": "weekly"},
4
+ "metrics": {
5
+ "outreach_sends": 40,
6
+ "replies": 6,
7
+ "bookings": 0,
8
+ "lp_sessions": 180,
9
+ "downloads": 22,
10
+ "download_rate_pct": 12.2,
11
+ "reply_to_booking_rate_pct": 0
12
+ }
13
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "status": "completed",
3
+ "policy_id": "coaching_funnel_demo_v1",
4
+ "benchmark_version": "demo-1",
5
+ "findings": [
6
+ {
7
+ "finding": "NO_BOOKING",
8
+ "severity": "error",
9
+ "detail": {"metric": "bookings", "threshold": ">= 1", "observed": 0},
10
+ "action": "blocked — requires operator override"
11
+ },
12
+ {
13
+ "finding": "DOWNLOAD_RATE_BELOW_DOCTRINE",
14
+ "severity": "warning",
15
+ "detail": {"metric": "download_rate_pct", "threshold": ">= 25.0 (benchmark)", "observed": 12.2},
16
+ "action": "none — surfaced for the operator"
17
+ },
18
+ {
19
+ "state": "insufficient_data",
20
+ "detail": {"metric": "reply_to_booking_rate_pct"},
21
+ "reason": "cohort_attribution_unavailable"
22
+ }
23
+ ]
24
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "schema_version": 1,
3
+ "benchmark_version": "demo-broken",
4
+ "as_of": "2026-08-01",
5
+ "sources": [],
6
+ "values": {
7
+ "lead_magnet_download_rate_pct": {"value": 25.0}
8
+ }
9
+ }
@@ -0,0 +1,9 @@
1
+ schema_version: 2
2
+ policy_id: dependent_required_violation_demo
3
+ metrics: [replies, reply_to_booking_rate_pct]
4
+ rules:
5
+ - id: BOOKING_CONVERSION_TRACKED
6
+ metric: reply_to_booking_rate_pct
7
+ check: {op: gte, threshold: 10}
8
+ severity: warning
9
+ requires: {min_denominator: 25, reason_code: cohort_attribution_unavailable}
@@ -0,0 +1,8 @@
1
+ schema_version: 2
2
+ policy_id: invalid_rule_shape_demo
3
+ metrics: [bookings]
4
+ rules:
5
+ - id: lower_case_bad_id
6
+ metric: bookings
7
+ check: {op: between, threshold: 1}
8
+ severity: error
@@ -0,0 +1,9 @@
1
+ schema_version: 2
2
+ policy_id: unknown_denominator_demo
3
+ metrics: [reply_to_booking_rate_pct]
4
+ rules:
5
+ - id: BOOKING_CONVERSION_TRACKED
6
+ metric: reply_to_booking_rate_pct
7
+ check: {op: gte, threshold: 10}
8
+ severity: warning
9
+ requires: {denominator_metric: replies, min_denominator: 25}
@@ -0,0 +1,8 @@
1
+ schema_version: 2
2
+ policy_id: unknown_rule_metric_demo
3
+ metrics: [bookings]
4
+ rules:
5
+ - id: NO_SIGNED_CONTRACT
6
+ metric: signed_contracts
7
+ check: {op: gte, threshold: 1}
8
+ severity: error
@@ -0,0 +1,5 @@
1
+ {
2
+ "schema_version": 1,
3
+ "period": {"start": "2026-08-17", "end": "2026-08-23"},
4
+ "metrics": {"outreach_sends": -3}
5
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "schema_version": 1,
3
+ "period": {"start": "2026-08-17", "end": "2026-08-23", "granularity": "weekly"},
4
+ "metrics": {}
5
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "schema_version": 1,
3
+ "period": {"start": "2026-08-17", "end": "2026-08-23", "granularity": "weekly"},
4
+ "metrics": {"replies": 25, "reply_to_booking_rate_pct": 4.0}
5
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "schema_version": 1,
3
+ "period": {"start": "2026-08-17", "end": "2026-08-23", "granularity": "weekly"},
4
+ "metrics": {"replies": 24, "reply_to_booking_rate_pct": 4.0}
5
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "schema_version": 1,
3
+ "period": {"start": "2026-08-17", "end": "2026-08-23", "granularity": "weekly"},
4
+ "metrics": {
5
+ "outreach_sends": 40,
6
+ "replies": 6,
7
+ "bookings": 0,
8
+ "lp_sessions": 180,
9
+ "downloads": 22,
10
+ "download_rate_pct": 12.2,
11
+ "reply_to_booking_rate_pct": 0,
12
+ "undeclared_extra_metric": 7
13
+ }
14
+ }
@@ -0,0 +1,97 @@
1
+ # Cognition Instructions: KPI Gate
2
+
3
+ You have access to the `monitoring/kpi_gate` tool.
4
+
5
+ This skill is a **deterministic, offline KPI gate**: a metrics snapshot plus a
6
+ policy charter (and optional versioned benchmark data) go in, structured
7
+ findings come out. `execute()` is a pure function with no network calls and no
8
+ side effects; identical input always returns identical output.
9
+
10
+ Limits: it is an auditor, not a data pipeline. It never fetches CRM, email, or
11
+ analytics data, never estimates missing values, and never optimizes thresholds.
12
+
13
+ ## Agent-loop contract
14
+
15
+ - `error` finding → the host blocks the dependent action until an operator
16
+ override is recorded.
17
+ - `warning` finding → surface to the operator; never block on a warning.
18
+ - `insufficient_data` → treat the metric as absent. The host must not
19
+ substitute, estimate, or backfill a value.
20
+
21
+ ## When to invoke
22
+
23
+ - Gating a scheduled action (send, publish, spend) on business-KPI health
24
+ - Auditing a periodic metrics snapshot against operator-declared thresholds
25
+ - Comparing observed metrics against versioned benchmark doctrine
26
+
27
+ Do not invoke it to collect metrics, to explain why a metric moved (no causal
28
+ inference), or to pick thresholds (no optimization).
29
+
30
+ ## Inputs
31
+
32
+ - `metrics` (required): snapshot object — `schema_version: 1`, a `period`
33
+ (`start`, `end`, `granularity`), and a map of `lower_snake_case` keys to
34
+ non-negative numbers. Every key must be declared by the policy.
35
+ - `policy` (required): charter object — `schema_version: 2`, `policy_id`, the
36
+ closed `metrics` declaration, and ordered `rules`. Finding ids (for example
37
+ `NO_BOOKING`) are declared here, not in the skill. Typically maintained as
38
+ versioned YAML and parsed by the host before the call.
39
+ - `benchmarks` (optional): versioned benchmark data — required only when a
40
+ rule uses `benchmark_ref`. A demo file ships at `kb/benchmarks_demo.json`.
41
+
42
+ Reference JSON Schemas for all three inputs ship under `schemas/` in this
43
+ bundle. The skill enforces the same constraints with explicit stdlib checks
44
+ (`requirements: []` is deliberate); the schema files are documentation, not a
45
+ runtime dependency. Hosts that call `validate_params()` also get top-level
46
+ argument validation from the manifest.
47
+
48
+ ## How to interpret results
49
+
50
+ A completed run returns `status: "completed"` with `policy_id`,
51
+ `benchmark_version` (`null` when no benchmarks input was supplied), and
52
+ `findings` in rule-declaration order:
53
+
54
+ - Rule finding: `finding` (charter-declared id), `severity`, `detail`
55
+ (`metric`, `threshold`, `observed`), `action`
56
+ (`blocked — requires operator override` or
57
+ `none — surfaced for the operator`).
58
+ - Refusal: `state: "insufficient_data"`, `detail.metric`, and `reason` — the
59
+ rule's declared `reason_code`, or `honesty_floor_unmet` when the rule
60
+ declared none, or `metric_missing_from_snapshot` when the rule's metric is
61
+ absent from the snapshot. When a granularity floor or a missing denominator
62
+ caused the refusal, `detail.unmet_floor` names it (`granularity` or
63
+ `denominator`); the canonical below-minimum-denominator refusal keeps the
64
+ exact shape pinned by issue #317.
65
+
66
+ A contract violation returns `status: "error"` with
67
+ `error.code` from the closed registry (`INVALID_METRICS_SCHEMA`,
68
+ `INVALID_POLICY_SCHEMA`, `INVALID_BENCHMARKS_SCHEMA`, `NO_METRICS_PROVIDED`,
69
+ `UNKNOWN_METRIC_KEY`, `UNKNOWN_RULE_METRIC`, `UNKNOWN_DENOMINATOR_METRIC`,
70
+ `BENCHMARK_VERSION_MISSING`, `BENCHMARK_REF_UNRESOLVED`) and a deterministic
71
+ `error.detail`. Errors and honest non-computability never mix: a refusal is a
72
+ finding inside a completed run, never an error envelope.
73
+
74
+ ## Reserved fields (v1)
75
+
76
+ `check.applies_to` is shape-validated and echoed into `detail.applies_to` on a
77
+ finding, but carries no evaluation semantics in v1. Do not assume it filters
78
+ or scopes rule evaluation.
79
+
80
+ ## Validation order (fail-closed)
81
+
82
+ 1. Strict schema checks on `metrics`, then `policy`, then `benchmarks` — the
83
+ first violation returns a contract error.
84
+ 2. Cross-checks: rule metrics and denominator metrics must be declared by the
85
+ policy; snapshot keys must be declared by the policy; every
86
+ `benchmark_ref` must resolve.
87
+ 3. Honesty floors: declared preconditions only — the evaluator never infers
88
+ which metric backs a rate. An unmet floor refuses with the declared reason
89
+ code.
90
+ 4. Rules evaluate in declared order; a passing rule emits nothing.
91
+
92
+ ## What this skill cannot do
93
+
94
+ - Data acquisition: it never fetches, scrapes, or polls anything.
95
+ - Causal inference: it reports threshold breaches, not why they happened.
96
+ - Threshold optimization: thresholds come from the charter and benchmarks;
97
+ the skill never tunes them.
@@ -0,0 +1,15 @@
1
+ {
2
+ "schema_version": 1,
3
+ "benchmark_version": "demo-1",
4
+ "as_of": "2026-08-01",
5
+ "sources": [
6
+ "https://github.com/ARPAHLS/skillware/issues/317"
7
+ ],
8
+ "values": {
9
+ "lead_magnet_download_rate_pct": {
10
+ "value": 25.0,
11
+ "unit": "pct",
12
+ "denominator_scope": "unique landing-page sessions"
13
+ }
14
+ }
15
+ }
@@ -0,0 +1,67 @@
1
+ name: monitoring/kpi_gate
2
+ version: 0.1.0
3
+ description: >
4
+ Deterministic business-KPI gate. Evaluates a metrics snapshot against an
5
+ operator-maintained policy charter and optional versioned benchmark data,
6
+ returning structured findings with two severities (error, warning) and one
7
+ honest third state (insufficient_data with reason codes). Strict schemas on
8
+ all three inputs, a closed rule set, and fail-closed contract errors from a
9
+ closed registry. Pure evaluation only: no network calls, no data fetching,
10
+ no side effects; identical input always returns identical output.
11
+ short_description: "Deterministic KPI gate: metrics snapshot vs policy charter, fail-closed findings."
12
+ issuer:
13
+ name: Masa
14
+ email: masa88keith@gmail.com
15
+ github: mrmasa88
16
+ org: AO
17
+ category: monitoring
18
+ parameters:
19
+ type: object
20
+ properties:
21
+ metrics:
22
+ type: object
23
+ description: >
24
+ Metrics snapshot object (metrics schema v1): schema_version, period
25
+ (start, end, granularity), and a metrics map of lower_snake_case keys
26
+ to non-negative numbers. Assembled upstream; this skill never fetches data.
27
+ policy:
28
+ type: object
29
+ description: >
30
+ Policy charter object (policy schema v2): schema_version, policy_id, the
31
+ closed declaration of metric keys, and the ordered rule list. Typically
32
+ maintained as versioned YAML and parsed by the host before the call.
33
+ benchmarks:
34
+ type: object
35
+ description: >
36
+ Optional benchmark data object (benchmarks schema v1) with
37
+ benchmark_version, as_of date, sources, and named values. Required only
38
+ when the policy references benchmark_ref checks.
39
+ required:
40
+ - metrics
41
+ - policy
42
+ additionalProperties: false
43
+ outputs:
44
+ status:
45
+ type: string
46
+ description: completed for an evaluation run; error for a contract violation.
47
+ policy_id:
48
+ type: string
49
+ description: The policy_id of the evaluated charter.
50
+ benchmark_version:
51
+ type: string
52
+ description: benchmark_version of the supplied benchmark data, or null when none was supplied.
53
+ findings:
54
+ type: array
55
+ description: >
56
+ Ordered findings. Rule findings carry finding, severity, detail, and
57
+ action; refusals carry state insufficient_data, detail, and reason.
58
+ requirements: []
59
+ constitution: |
60
+ 1. Evaluate only - no data fetching, no side effects, no automated remediation.
61
+ 2. Deterministic, offline core - no network in execute(); identical input returns identical output.
62
+ 3. Refuse rather than guess - what cannot be computed honestly returns insufficient_data with a reason code; no default substitution.
63
+ 4. Every finding explained - code, metric, threshold, and observed value always attached.
64
+ 5. Honest limits documented - what this skill does not do (data acquisition, causal inference, threshold optimization) is stated explicitly.
65
+ presentation:
66
+ icon: gauge
67
+ color: "#0f766e"
@@ -0,0 +1,25 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "skillware:monitoring/kpi_gate:benchmarks:1",
4
+ "type": "object",
5
+ "required": ["schema_version", "benchmark_version", "as_of", "sources", "values"],
6
+ "additionalProperties": false,
7
+ "properties": {
8
+ "schema_version": {"const": 1},
9
+ "benchmark_version": {"type": "string"},
10
+ "as_of": {"type": "string", "format": "date"},
11
+ "sources": {"type": "array", "minItems": 1, "items": {"type": "string", "format": "uri"}},
12
+ "values": {
13
+ "type": "object", "minProperties": 1,
14
+ "patternProperties": {
15
+ "^[a-z][a-z0-9_]*$": {
16
+ "type": "object", "required": ["value"], "additionalProperties": false,
17
+ "properties": {"value": {"type": "number"},
18
+ "unit": {"type": "string"},
19
+ "denominator_scope": {"type": "string"}}
20
+ }
21
+ },
22
+ "additionalProperties": false
23
+ }
24
+ }
25
+ }