eio-agents 0.6.0rc1__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 (260) hide show
  1. eio_agents-0.6.0rc1/.gitignore +43 -0
  2. eio_agents-0.6.0rc1/CHANGELOG.md +426 -0
  3. eio_agents-0.6.0rc1/CITATION.cff +23 -0
  4. eio_agents-0.6.0rc1/CODE_OF_CONDUCT.md +131 -0
  5. eio_agents-0.6.0rc1/CONTRIBUTING.md +132 -0
  6. eio_agents-0.6.0rc1/GOVERNANCE.md +94 -0
  7. eio_agents-0.6.0rc1/LICENSE +202 -0
  8. eio_agents-0.6.0rc1/NOTICE +27 -0
  9. eio_agents-0.6.0rc1/PKG-INFO +106 -0
  10. eio_agents-0.6.0rc1/README.md +57 -0
  11. eio_agents-0.6.0rc1/SECURITY.md +70 -0
  12. eio_agents-0.6.0rc1/docs/api.md +444 -0
  13. eio_agents-0.6.0rc1/docs/cli.md +176 -0
  14. eio_agents-0.6.0rc1/docs/concepts.md +277 -0
  15. eio_agents-0.6.0rc1/docs/eio-agents-stack.svg +44 -0
  16. eio_agents-0.6.0rc1/docs/quickstart.md +82 -0
  17. eio_agents-0.6.0rc1/docs/standards.md +142 -0
  18. eio_agents-0.6.0rc1/docs/verification.md +212 -0
  19. eio_agents-0.6.0rc1/docs/versioning.md +116 -0
  20. eio_agents-0.6.0rc1/pyproject.toml +109 -0
  21. eio_agents-0.6.0rc1/src/eio_agents/__init__.py +53 -0
  22. eio_agents-0.6.0rc1/src/eio_agents/__main__.py +6 -0
  23. eio_agents-0.6.0rc1/src/eio_agents/adapters.py +58 -0
  24. eio_agents-0.6.0rc1/src/eio_agents/adjudication/__init__.py +31 -0
  25. eio_agents-0.6.0rc1/src/eio_agents/api.py +209 -0
  26. eio_agents-0.6.0rc1/src/eio_agents/base/__init__.py +6 -0
  27. eio_agents-0.6.0rc1/src/eio_agents/base/canon.py +125 -0
  28. eio_agents-0.6.0rc1/src/eio_agents/base/errors.py +15 -0
  29. eio_agents-0.6.0rc1/src/eio_agents/base/version.py +4 -0
  30. eio_agents-0.6.0rc1/src/eio_agents/cli.py +206 -0
  31. eio_agents-0.6.0rc1/src/eio_agents/compliance/__init__.py +5 -0
  32. eio_agents-0.6.0rc1/src/eio_agents/compliance/controls.py +78 -0
  33. eio_agents-0.6.0rc1/src/eio_agents/compliance/selection.py +57 -0
  34. eio_agents-0.6.0rc1/src/eio_agents/evidence/__init__.py +6 -0
  35. eio_agents-0.6.0rc1/src/eio_agents/evidence/context_refs.py +158 -0
  36. eio_agents-0.6.0rc1/src/eio_agents/evidence/contract.py +67 -0
  37. eio_agents-0.6.0rc1/src/eio_agents/evidence/locate.py +16 -0
  38. eio_agents-0.6.0rc1/src/eio_agents/evidence/redaction.py +63 -0
  39. eio_agents-0.6.0rc1/src/eio_agents/evidence/refs.py +129 -0
  40. eio_agents-0.6.0rc1/src/eio_agents/evidence/witness.py +12 -0
  41. eio_agents-0.6.0rc1/src/eio_agents/ontology/__init__.py +189 -0
  42. eio_agents-0.6.0rc1/src/eio_agents/ontology/data/CHANGELOG.md +297 -0
  43. eio_agents-0.6.0rc1/src/eio_agents/ontology/data/README.md +173 -0
  44. eio_agents-0.6.0rc1/src/eio_agents/ontology/data/RELEASE-DIGESTS.json +61 -0
  45. eio_agents-0.6.0rc1/src/eio_agents/ontology/data/assurance/system-of-record.yaml +123 -0
  46. eio_agents-0.6.0rc1/src/eio_agents/ontology/data/compliance/frameworks.yaml +260 -0
  47. eio_agents-0.6.0rc1/src/eio_agents/ontology/data/context/criteria.yaml +196 -0
  48. eio_agents-0.6.0rc1/src/eio_agents/ontology/data/core/decisions.yaml +93 -0
  49. eio_agents-0.6.0rc1/src/eio_agents/ontology/data/core/entities.yaml +248 -0
  50. eio_agents-0.6.0rc1/src/eio_agents/ontology/data/core/evidence.yaml +288 -0
  51. eio_agents-0.6.0rc1/src/eio_agents/ontology/data/core/flow.yaml +287 -0
  52. eio_agents-0.6.0rc1/src/eio_agents/ontology/data/core/relations.yaml +211 -0
  53. eio_agents-0.6.0rc1/src/eio_agents/ontology/data/core/taxonomies.yaml +59 -0
  54. eio_agents-0.6.0rc1/src/eio_agents/ontology/data/domains/aviation-airline.yaml +186 -0
  55. eio_agents-0.6.0rc1/src/eio_agents/ontology/data/domains/customer-support.yaml +91 -0
  56. eio_agents-0.6.0rc1/src/eio_agents/ontology/data/domains/energy-utilities.yaml +141 -0
  57. eio_agents-0.6.0rc1/src/eio_agents/ontology/data/domains/financial-services.yaml +123 -0
  58. eio_agents-0.6.0rc1/src/eio_agents/ontology/data/domains/generic-agent.yaml +111 -0
  59. eio_agents-0.6.0rc1/src/eio_agents/ontology/data/domains/healthcare-operations.yaml +106 -0
  60. eio_agents-0.6.0rc1/src/eio_agents/ontology/data/domains/hr-employment.yaml +105 -0
  61. eio_agents-0.6.0rc1/src/eio_agents/ontology/data/domains/legal-public-sector.yaml +114 -0
  62. eio_agents-0.6.0rc1/src/eio_agents/ontology/data/domains/medical-devices.yaml +163 -0
  63. eio_agents-0.6.0rc1/src/eio_agents/ontology/data/domains/payments-cardholder.yaml +150 -0
  64. eio_agents-0.6.0rc1/src/eio_agents/ontology/data/domains/software-agents.yaml +118 -0
  65. eio_agents-0.6.0rc1/src/eio_agents/ontology/data/governance/gates.yaml +446 -0
  66. eio_agents-0.6.0rc1/src/eio_agents/ontology/data/graph/context-links.yaml +211 -0
  67. eio_agents-0.6.0rc1/src/eio_agents/ontology/data/graph/domain-links.yaml +34 -0
  68. eio_agents-0.6.0rc1/src/eio_agents/ontology/data/manifest.yaml +94 -0
  69. eio_agents-0.6.0rc1/src/eio_agents/ontology/data/mappings/frameworks.yaml +25 -0
  70. eio_agents-0.6.0rc1/src/eio_agents/ontology/data/mappings/metrics.yaml +150 -0
  71. eio_agents-0.6.0rc1/src/eio_agents/ontology/data/reference/cases.jsonl +45 -0
  72. eio_agents-0.6.0rc1/src/eio_agents/ontology/data/reliability/ledgers.yaml +164 -0
  73. eio_agents-0.6.0rc1/src/eio_agents/ontology/data/risks/action-safety.yaml +354 -0
  74. eio_agents-0.6.0rc1/src/eio_agents/ontology/data/risks/catalog.yaml +232 -0
  75. eio_agents-0.6.0rc1/src/eio_agents/ontology/data/risks/content-code-safety.yaml +151 -0
  76. eio_agents-0.6.0rc1/src/eio_agents/ontology/data/risks/context-trust.yaml +280 -0
  77. eio_agents-0.6.0rc1/src/eio_agents/ontology/data/risks/data-handling.yaml +284 -0
  78. eio_agents-0.6.0rc1/src/eio_agents/ontology/data/risks/evaluator-reliability.yaml +199 -0
  79. eio_agents-0.6.0rc1/src/eio_agents/ontology/data/risks/fairness-rights.yaml +220 -0
  80. eio_agents-0.6.0rc1/src/eio_agents/ontology/data/risks/grounding.yaml +230 -0
  81. eio_agents-0.6.0rc1/src/eio_agents/ontology/data/risks/safeguards.yaml +234 -0
  82. eio_agents-0.6.0rc1/src/eio_agents/ontology/data/scoring/axes.yaml +219 -0
  83. eio_agents-0.6.0rc1/src/eio_agents/ontology/data/templates/core.yaml +344 -0
  84. eio_agents-0.6.0rc1/src/eio_agents/ontology/data/templates/why.yaml +871 -0
  85. eio_agents-0.6.0rc1/src/eio_agents/per/__init__.py +15 -0
  86. eio_agents-0.6.0rc1/src/eio_agents/per/archive.py +12 -0
  87. eio_agents-0.6.0rc1/src/eio_agents/per/bundle.py +1390 -0
  88. eio_agents-0.6.0rc1/src/eio_agents/per/capsule.py +10 -0
  89. eio_agents-0.6.0rc1/src/eio_agents/per/catalogue_split.py +242 -0
  90. eio_agents-0.6.0rc1/src/eio_agents/per/conformance.py +146 -0
  91. eio_agents-0.6.0rc1/src/eio_agents/per/context.py +6 -0
  92. eio_agents-0.6.0rc1/src/eio_agents/per/data/limitations-core.json +294 -0
  93. eio_agents-0.6.0rc1/src/eio_agents/per/data/limitations.json +545 -0
  94. eio_agents-0.6.0rc1/src/eio_agents/per/data/rc1_only.json +166 -0
  95. eio_agents-0.6.0rc1/src/eio_agents/per/evidence.py +42 -0
  96. eio_agents-0.6.0rc1/src/eio_agents/per/header.py +38 -0
  97. eio_agents-0.6.0rc1/src/eio_agents/per/instance_iri.py +51 -0
  98. eio_agents-0.6.0rc1/src/eio_agents/per/io.py +44 -0
  99. eio_agents-0.6.0rc1/src/eio_agents/per/limitations.py +43 -0
  100. eio_agents-0.6.0rc1/src/eio_agents/per/native_full_wire.py +200 -0
  101. eio_agents-0.6.0rc1/src/eio_agents/per/native_preview.py +168 -0
  102. eio_agents-0.6.0rc1/src/eio_agents/per/native_reportability.py +110 -0
  103. eio_agents-0.6.0rc1/src/eio_agents/per/native_score_inputs.py +168 -0
  104. eio_agents-0.6.0rc1/src/eio_agents/per/native_score_preview.py +196 -0
  105. eio_agents-0.6.0rc1/src/eio_agents/per/privacy.py +1365 -0
  106. eio_agents-0.6.0rc1/src/eio_agents/per/projection.py +509 -0
  107. eio_agents-0.6.0rc1/src/eio_agents/py.typed +0 -0
  108. eio_agents-0.6.0rc1/src/eio_agents/reliability/__init__.py +76 -0
  109. eio_agents-0.6.0rc1/src/eio_agents/resolvers/__init__.py +21 -0
  110. eio_agents-0.6.0rc1/src/eio_agents/schemas/__init__.py +52 -0
  111. eio_agents-0.6.0rc1/src/eio_agents/schemas/bundle/bundle-3.0.0-draft.1.schema.json +312 -0
  112. eio_agents-0.6.0rc1/src/eio_agents/schemas/bundle/bundle-3.0.0-draft.2.schema.json +319 -0
  113. eio_agents-0.6.0rc1/src/eio_agents/schemas/eio/0.6.0/eio-context-0.6.0.jsonld +109 -0
  114. eio_agents-0.6.0rc1/src/eio_agents/schemas/eio/0.6.0/evaluation-claim.schema.json +154 -0
  115. eio_agents-0.6.0rc1/src/eio_agents/schemas/eio/0.6.0/evidence-graph.schema.json +74 -0
  116. eio_agents-0.6.0rc1/src/eio_agents/schemas/eio/0.6.0/module.schema.json +2389 -0
  117. eio_agents-0.6.0rc1/src/eio_agents/schemas/eio/0.6.0/reference-case.schema.json +33 -0
  118. eio_agents-0.6.0rc1/src/eio_agents/schemas/eio/eio-context-0.4.0.jsonld +109 -0
  119. eio_agents-0.6.0rc1/src/eio_agents/schemas/eio/eio-context-0.5.0-draft.1.jsonld +109 -0
  120. eio_agents-0.6.0rc1/src/eio_agents/schemas/eio/evaluation-claim.schema.json +154 -0
  121. eio_agents-0.6.0rc1/src/eio_agents/schemas/eio/evidence-graph.schema.json +74 -0
  122. eio_agents-0.6.0rc1/src/eio_agents/schemas/eio/module.schema.json +2389 -0
  123. eio_agents-0.6.0rc1/src/eio_agents/schemas/eio/reference-case.schema.json +33 -0
  124. eio_agents-0.6.0rc1/src/eio_agents/schemas/per/per-2.0-neutral-preview.context.jsonld +1061 -0
  125. eio_agents-0.6.0rc1/src/eio_agents/schemas/per/per-2.0-rc3-draft.context.jsonld +1061 -0
  126. eio_agents-0.6.0rc1/src/eio_agents/schemas/per/per-2.0.0-rc2-draft.schema.json +7689 -0
  127. eio_agents-0.6.0rc1/src/eio_agents/schemas/per/per-2.0.0-rc2-neutral-preview.schema.json +7689 -0
  128. eio_agents-0.6.0rc1/src/eio_agents/schemas/per/per-2.0.0-rc3-draft.schema.json +8141 -0
  129. eio_agents-0.6.0rc1/src/eio_agents/schemas/per/per-2.0.0-rc3-neutral-preview.schema.json +7706 -0
  130. eio_agents-0.6.0rc1/src/eio_agents/schemas/per/per-2.0.0-rc4-draft.schema.json +8420 -0
  131. eio_agents-0.6.0rc1/src/eio_agents/schemas/per/per-2.0.0-rc5-policy-draft.schema.json +8437 -0
  132. eio_agents-0.6.0rc1/src/eio_agents/schemas/per/per-2.0.0.schema.json +8437 -0
  133. eio_agents-0.6.0rc1/src/eio_agents/schemas/per/per-2.0.context.jsonld +1061 -0
  134. eio_agents-0.6.0rc1/src/eio_agents/schemas/per/per-2.0.schema.json +1233 -0
  135. eio_agents-0.6.0rc1/src/eio_agents/schemas/scoring/native-score-block-0.1.0-draft.schema.json +81 -0
  136. eio_agents-0.6.0rc1/src/eio_agents/schemas/scoring/native-score-block-0.2.0-draft.1.schema.json +82 -0
  137. eio_agents-0.6.0rc1/src/eio_agents/schemas/scoring/native-score-block-0.3.0-draft.1.schema.json +108 -0
  138. eio_agents-0.6.0rc1/src/eio_agents/schemas/scoring/native-score-block-0.3.1-draft.1.schema.json +108 -0
  139. eio_agents-0.6.0rc1/src/eio_agents/schemas/scoring/scoring-profile-0.1.0-draft.schema.json +55 -0
  140. eio_agents-0.6.0rc1/src/eio_agents/schemas/scoring/scoring-profile-0.2.0-draft.1.schema.json +55 -0
  141. eio_agents-0.6.0rc1/src/eio_agents/scoring/__init__.py +305 -0
  142. eio_agents-0.6.0rc1/src/eio_agents/scoring/engine.py +209 -0
  143. eio_agents-0.6.0rc1/src/eio_agents/scoring/profiles.py +202 -0
  144. eio_agents-0.6.0rc1/src/eio_agents/scoring/reference.py +538 -0
  145. eio_agents-0.6.0rc1/src/eio_agents/semantics/__init__.py +13 -0
  146. eio_agents-0.6.0rc1/src/eio_agents/semantics/claims.py +43 -0
  147. eio_agents-0.6.0rc1/src/eio_agents/semantics/coverage.py +86 -0
  148. eio_agents-0.6.0rc1/src/eio_agents/semantics/findings.py +93 -0
  149. eio_agents-0.6.0rc1/src/eio_agents/semantics/ids.py +60 -0
  150. eio_agents-0.6.0rc1/src/eio_agents/semantics/proof.py +105 -0
  151. eio_agents-0.6.0rc1/src/eio_agents/semantics/release.py +276 -0
  152. eio_agents-0.6.0rc1/src/eio_agents/semantics/scope.py +91 -0
  153. eio_agents-0.6.0rc1/src/eio_agents/semantics/why.py +142 -0
  154. eio_agents-0.6.0rc1/src/eio_agents/validation/__init__.py +18 -0
  155. eio_agents-0.6.0rc1/src/eio_agents/validation/canon.py +72 -0
  156. eio_agents-0.6.0rc1/src/eio_agents/validation/catalogue.py +164 -0
  157. eio_agents-0.6.0rc1/src/eio_agents/validation/checker.py +1340 -0
  158. eio_agents-0.6.0rc1/src/eio_agents/validation/data/reference-profile-0.2.0-draft.1.json +77 -0
  159. eio_agents-0.6.0rc1/src/eio_agents/validation/data/reference-profile-0.3.0-draft.1.json +76 -0
  160. eio_agents-0.6.0rc1/src/eio_agents/validation/data/reference-profile-0.3.1-draft.1.json +76 -0
  161. eio_agents-0.6.0rc1/src/eio_agents/validation/explain.py +137 -0
  162. eio_agents-0.6.0rc1/src/eio_agents/validation/explore.py +174 -0
  163. eio_agents-0.6.0rc1/src/eio_agents/validation/full_score.py +324 -0
  164. eio_agents-0.6.0rc1/src/eio_agents/validation/gates.py +65 -0
  165. eio_agents-0.6.0rc1/src/eio_agents/validation/native_score.py +1018 -0
  166. eio_agents-0.6.0rc1/src/eio_agents/validation/partial_score.py +102 -0
  167. eio_agents-0.6.0rc1/src/eio_agents/validation/pointer.py +33 -0
  168. eio_agents-0.6.0rc1/src/eio_agents/validation/privacy.py +1584 -0
  169. eio_agents-0.6.0rc1/src/eio_agents/validation/reader.py +114 -0
  170. eio_agents-0.6.0rc1/src/eio_agents/validation/redaction.py +88 -0
  171. eio_agents-0.6.0rc1/src/eio_agents/validation/render.py +69 -0
  172. eio_agents-0.6.0rc1/src/eio_agents/validation/score_basis.py +38 -0
  173. eio_agents-0.6.0rc1/src/eio_agents/validation/score_block_diagnostic.py +202 -0
  174. eio_agents-0.6.0rc1/src/eio_agents/validation/validate.py +976 -0
  175. eio_agents-0.6.0rc1/src/eio_agents/validation/verify.py +474 -0
  176. eio_agents-0.6.0rc1/tests/conftest.py +10 -0
  177. eio_agents-0.6.0rc1/tests/data/native/author_native.py +153 -0
  178. eio_agents-0.6.0rc1/tests/data/native/native.bundle.json +520 -0
  179. eio_agents-0.6.0rc1/tests/data/native/native.per.jcs +1 -0
  180. eio_agents-0.6.0rc1/tests/data/native/native.rc1_problems.json +4 -0
  181. eio_agents-0.6.0rc1/tests/data/native/synthetic-cited-native.bundle.json +344 -0
  182. eio_agents-0.6.0rc1/tests/data/native/v0_6/native.bundle.json +520 -0
  183. eio_agents-0.6.0rc1/tests/data/native/v0_6/native.per.jcs +1 -0
  184. eio_agents-0.6.0rc1/tests/data/native/v0_6/native.rc1_problems.json +4 -0
  185. eio_agents-0.6.0rc1/tests/data/native/v0_6/source-complete.bundle.json +658 -0
  186. eio_agents-0.6.0rc1/tests/data/native/v0_6/source-complete.per.jcs +1 -0
  187. eio_agents-0.6.0rc1/tests/data/native/v0_6/source-complete.rc5-policy-draft.per.jcs +1 -0
  188. eio_agents-0.6.0rc1/tests/data/native/v0_6/synthetic-cited-native.bundle.json +589 -0
  189. eio_agents-0.6.0rc1/tests/data/reference/decision_vectors.json +58 -0
  190. eio_agents-0.6.0rc1/tests/full_native_score_case.py +106 -0
  191. eio_agents-0.6.0rc1/tests/historical/partial_score_gate_0_5.py +93 -0
  192. eio_agents-0.6.0rc1/tests/test_adapters.py +61 -0
  193. eio_agents-0.6.0rc1/tests/test_bundle.py +1287 -0
  194. eio_agents-0.6.0rc1/tests/test_catalogue_split_draft.py +201 -0
  195. eio_agents-0.6.0rc1/tests/test_ci_collection.py +19 -0
  196. eio_agents-0.6.0rc1/tests/test_cli.py +109 -0
  197. eio_agents-0.6.0rc1/tests/test_context.py +24 -0
  198. eio_agents-0.6.0rc1/tests/test_current_release_fixtures.py +60 -0
  199. eio_agents-0.6.0rc1/tests/test_evidence.py +110 -0
  200. eio_agents-0.6.0rc1/tests/test_full_native_score_gate.py +127 -0
  201. eio_agents-0.6.0rc1/tests/test_full_score_verifier.py +44 -0
  202. eio_agents-0.6.0rc1/tests/test_goldens.py +59 -0
  203. eio_agents-0.6.0rc1/tests/test_ids_and_io.py +66 -0
  204. eio_agents-0.6.0rc1/tests/test_import_surface.py +180 -0
  205. eio_agents-0.6.0rc1/tests/test_l2_exit_deviations.py +456 -0
  206. eio_agents-0.6.0rc1/tests/test_l3b_explore.py +70 -0
  207. eio_agents-0.6.0rc1/tests/test_l5a_native_packaged.py +71 -0
  208. eio_agents-0.6.0rc1/tests/test_l5a_native_projection.py +84 -0
  209. eio_agents-0.6.0rc1/tests/test_l5a_neutral_namespace.py +50 -0
  210. eio_agents-0.6.0rc1/tests/test_layering.py +239 -0
  211. eio_agents-0.6.0rc1/tests/test_layout.py +237 -0
  212. eio_agents-0.6.0rc1/tests/test_limitations.py +88 -0
  213. eio_agents-0.6.0rc1/tests/test_native.py +212 -0
  214. eio_agents-0.6.0rc1/tests/test_native_context_gap_fidelity.py +67 -0
  215. eio_agents-0.6.0rc1/tests/test_native_full_wire.py +73 -0
  216. eio_agents-0.6.0rc1/tests/test_native_proof_verifier.py +46 -0
  217. eio_agents-0.6.0rc1/tests/test_native_reportability.py +187 -0
  218. eio_agents-0.6.0rc1/tests/test_native_score_gate.py +504 -0
  219. eio_agents-0.6.0rc1/tests/test_native_score_inputs.py +152 -0
  220. eio_agents-0.6.0rc1/tests/test_native_score_preview.py +151 -0
  221. eio_agents-0.6.0rc1/tests/test_native_scored_end_to_end.py +88 -0
  222. eio_agents-0.6.0rc1/tests/test_native_scoring_seam.py +33 -0
  223. eio_agents-0.6.0rc1/tests/test_native_strict_proof_draft.py +141 -0
  224. eio_agents-0.6.0rc1/tests/test_neutral_constants.py +168 -0
  225. eio_agents-0.6.0rc1/tests/test_neutral_data_split.py +56 -0
  226. eio_agents-0.6.0rc1/tests/test_neutral_dependencies.py +186 -0
  227. eio_agents-0.6.0rc1/tests/test_neutral_floor_boundary.py +33 -0
  228. eio_agents-0.6.0rc1/tests/test_ontology.py +69 -0
  229. eio_agents-0.6.0rc1/tests/test_partial_score_gate.py +22 -0
  230. eio_agents-0.6.0rc1/tests/test_privacy.py +272 -0
  231. eio_agents-0.6.0rc1/tests/test_proof_group_exploration.py +141 -0
  232. eio_agents-0.6.0rc1/tests/test_public_contract_resources.py +28 -0
  233. eio_agents-0.6.0rc1/tests/test_rc4_explain.py +104 -0
  234. eio_agents-0.6.0rc1/tests/test_rc4_policy_preview.py +135 -0
  235. eio_agents-0.6.0rc1/tests/test_reference_basis.py +54 -0
  236. eio_agents-0.6.0rc1/tests/test_reference_decision_vectors.py +40 -0
  237. eio_agents-0.6.0rc1/tests/test_reference_draft_metric_values.py +339 -0
  238. eio_agents-0.6.0rc1/tests/test_reference_membership.py +105 -0
  239. eio_agents-0.6.0rc1/tests/test_reverify_l2.py +730 -0
  240. eio_agents-0.6.0rc1/tests/test_score_basis.py +61 -0
  241. eio_agents-0.6.0rc1/tests/test_scoring_engine.py +218 -0
  242. eio_agents-0.6.0rc1/tests/test_semantics.py +119 -0
  243. eio_agents-0.6.0rc1/tests/test_stress.py +62 -0
  244. eio_agents-0.6.0rc1/tests/test_tools.py +31 -0
  245. eio_agents-0.6.0rc1/tests/test_uuidv5_instance_view.py +43 -0
  246. eio_agents-0.6.0rc1/tests/test_verifier_catalogue_independence.py +65 -0
  247. eio_agents-0.6.0rc1/tests/test_verifier_selftest.py +114 -0
  248. eio_agents-0.6.0rc1/tests/test_verify.py +155 -0
  249. eio_agents-0.6.0rc1/tests/test_views.py +65 -0
  250. eio_agents-0.6.0rc1/tests/test_xneu_l5a.py +109 -0
  251. eio_agents-0.6.0rc1/tools/build_rc3_scored_schema.py +64 -0
  252. eio_agents-0.6.0rc1/tools/eio_digests.py +106 -0
  253. eio_agents-0.6.0rc1/tools/eio_gates.py +1745 -0
  254. eio_agents-0.6.0rc1/tools/l5a_native_projector.py +13 -0
  255. eio_agents-0.6.0rc1/tools/l5a_neutral_namespace.py +148 -0
  256. eio_agents-0.6.0rc1/tools/l5a_neutralize_eio_schema.py +61 -0
  257. eio_agents-0.6.0rc1/tools/reissue_import_pins.py +52 -0
  258. eio_agents-0.6.0rc1/tools/reissue_public_fixtures.py +63 -0
  259. eio_agents-0.6.0rc1/tools/snapshots/eio-0.3.0-baseline.json +315 -0
  260. eio_agents-0.6.0rc1/tools/xneu_l5a.py +186 -0
@@ -0,0 +1,43 @@
1
+ # Python caches and builds
2
+ __pycache__/
3
+ *.py[cod]
4
+ *.egg-info/
5
+ build/
6
+ dist/
7
+ .eggs/
8
+
9
+ # Virtual environments
10
+ .venv/
11
+ venv/
12
+
13
+ # Tool caches and reports
14
+ .pytest_cache/
15
+ .ruff_cache/
16
+ .mypy_cache/
17
+ .pyright/
18
+ .tox/
19
+ .nox/
20
+ .coverage
21
+ .coverage.*
22
+ htmlcov/
23
+ coverage.xml
24
+
25
+ # Editors and operating systems
26
+ .idea/
27
+ .vscode/
28
+ *.swp
29
+ .DS_Store
30
+ Thumbs.db
31
+
32
+ # Local environment files
33
+ .env
34
+
35
+ # Local working directories
36
+ .progress/
37
+
38
+ # Owner-only publishing checklist (not for publication)
39
+ PUBLISHING_CHECKLIST.md
40
+
41
+ # Outputs of the quick start, written to the repository root
42
+ /*.per.json
43
+ /*.per.jcs
@@ -0,0 +1,426 @@
1
+ # Changelog
2
+
3
+ All notable changes to EIO-Agents (the `eio-agents` library) are documented in this file.
4
+
5
+ The format is based on [Keep a Changelog 1.1.0](https://keepachangelog.com/en/1.1.0/). Library versions follow
6
+ [PEP 440](https://peps.python.org/pep-0440/) with the meaning of Semantic Versioning; see
7
+ [docs/versioning.md](docs/versioning.md). EIO releases have their own changelog at
8
+ [src/eio_agents/ontology/data/CHANGELOG.md](src/eio_agents/ontology/data/CHANGELOG.md).
9
+
10
+ Every entry states the bundled EIO release, the PER version, and whether record bytes change. The `.devN` versions
11
+ below are development builds; `0.6.0rc1` is a release candidate, not a claim of certification.
12
+
13
+ ## [0.6.0rc1]
14
+
15
+ This release candidate bundles EIO
16
+ `0.6.0` (`ontology_digest` `a27cf1f3ab755446`), and adds source-complete native PER
17
+ `2.0.0` with reference scoring profile `0.3.1-draft.1`. Bundles without a declared proof set retain the
18
+ partial-score rc3 route.
19
+ Historical rc1 and EIO 0.4 records require their matching adapter and pinned release.
20
+ The rc4, L5a/S1b, L3s and L4 notes below describe earlier candidate stages, not the current draft.
21
+ Record bytes changed during those stages: R0→R3S for structural privacy at L3s, then R3S→R4 for
22
+ the scoring profile and rc2 scores block at L4. The native rc3 draft has its own pinned vectors.
23
+
24
+ ### Changed (PER 2.0.0 release candidate)
25
+
26
+ - A source-complete native bundle with an explicit proof set selects PER `2.0.0` and
27
+ reference profile `0.3.1-draft.1`. The canonical schema identifier is
28
+ `https://www.proofagent.ai/eio-agents/schema/per/2.0.0/per.schema.json`; website deployment and live verification remain separate gates.
29
+ - The draft minimum-score policy review is evaluated when readiness is measured; missing required source inputs
30
+ still withhold the affected score. The historical rc3 partial route remains available.
31
+ - Record bytes change: yes. The PER version and schema ID change record headers and their canonical digests. The synthetic
32
+ source-complete PER 2.0.0 vector is pinned at `tests/data/native/v0_6/source-complete.per.jcs`; the historical rc5
33
+ vector is retained as `source-complete.rc5-policy-draft.per.jcs`.
34
+ - The release-facing quick start, API, CLI and verification pages identify the current 0.6 synthetic fixture separately
35
+ from historically pinned examples. This documentation correction does not change record bytes.
36
+
37
+ ### Earlier change (unpublished rc4 full-score proposal)
38
+
39
+ - A source-complete native bundle now projects rc4 full-score PER with independently rederived
40
+ Q/E/C/G, overall readiness, decisive/reportable proof sets and four-component Governance G
41
+ without evidence freshness. Missing required sources withhold the affected score; rc3 bytes
42
+ are never silently interpreted under rc4.
43
+ - Added privacy-safe rc4 `explain --list`, numeric axis/metric/readiness summaries, and explicit
44
+ rc4 identifiers in `standards()` while retaining the historical rc3 keys.
45
+ - The package-version proposal changes the converter version written into new record headers;
46
+ canonical PER bytes and digests therefore change and must be reissued/gated before promotion.
47
+
48
+ ### Earlier change (L5a/S1b native draft)
49
+
50
+ - At that stage, the bundled manifest and release digests identified EIO `0.5.0-draft.1` (`ontology_digest`
51
+ `4cbe3a904af9038e`). The neutral native PER schema is `2.0.0-rc3-draft`; its proposed
52
+ `w3id.org` identifier does not establish a live public endpoint.
53
+ - Native records use the rc3 draft vocabulary and schema. Validated native scoring inputs can
54
+ produce a partial `reference-draft` score with independent checks; governance (G) and
55
+ readiness remain withheld when the required source evidence is unavailable. The owner #22
56
+ publication hold remains in force.
57
+
58
+ ### Changed (L4: EIO-Agents scoring, post-L3s rebase)
59
+
60
+ - Added `eio_agents.scoring.engine`: the readiness-index engine with no numeric defaults; parameters come from a
61
+ scoring-profile document. Added the profile registry, attested-profile mechanism and independent B4 schema/digest
62
+ validation. An adapter producer carries its profile document in the bundle; the draft EIO reference-profile API is
63
+ present but its scoring rules remain for S1b.
64
+ - Added the PER 2.0.0-rc2-draft schema. `scores.scoring_profile` is `{id, version, sha256}` and G component ids are
65
+ profile-declared. L3s's producer and independent verifier privacy tables now classify these public structural leaves,
66
+ admit only the reviewed harness-2.x/2.1.0 identity and six reviewed G ids for the L4 attested path, and retain all
67
+ fingerprint/resolve behaviour. New attested identities need an explicit trusted approval path before publication;
68
+ digest consistency alone does not make arbitrary identifiers private-safe.
69
+ - Removed `_vendored` and `_legacy`, their private-import exemptions and the vendored NOTICE entry. The harness adapter
70
+ owns its copied Report extractors, governance classifier and attested harness-2.x profile document.
71
+ - Reissued the same 13 frozen records as R4 from R3S. The reviewed diff changes only rc2/scoring leaves: FIN_3 and EXAM_B
72
+ G 52→46; credit-underwriter replay readiness 80.4→82.2. Claim/finding identities, privacy transformations and release
73
+ states are unchanged. `REFERENCE_R4.md` and `diff/REVIEWED_DIFF.md` in the isolated candidate record the exact digests.
74
+
75
+ ### Changed (L3s: the structural privacy fix, owner decisions #31 and #32)
76
+
77
+ - The closed field table (`eio_agents.per.privacy`): every string of a projected record, member names included, is a value
78
+ of the release's or the PER schema's vocabulary (checked for membership), a structural value of a recorded form, a
79
+ PROD-42 excerpt, a fingerprint `sha256-<64 hex>` of the exact producer text (plain SHA-256 over its UTF-8 bytes; keyed
80
+ before the first upload), or a text rendered from these. Producer free text (the agent's goal, role and business case,
81
+ model ids, persona names, capsule caveats, policy and profile names, fact sources, tool and retrieval names, context
82
+ artifact and searched file names, metric and component labels, custom scenario labels, limitation parameters) is
83
+ carried as its fingerprint; a summary shows `sha256-` and 12 hex digits, the full value staying in its params. A field
84
+ the table does not list fails closed (`PRIVACY_UNCLASSIFIED`); a record string equal to a producer text of the bundle
85
+ fails too (`PRIVACY_CLEAR_TEXT`). The round 2-4 pattern rules stay as a second layer; declared structural values (D-53)
86
+ stay form-checked until S2.
87
+ - A behavioural finding's fingerprint takes its scenario label's record value (a trap-library label in clear, any other
88
+ label as its fingerprint), so the verifier recomputes it from the record.
89
+ - The verifier's twin (`eio_agents.validation.privacy`): its own table; the new row W1 (every record string classified
90
+ and of its class); X1 renders a fingerprint in its display form; D2 runs on the record's clear view and checks every
91
+ fingerprint and decision against the bundle (T4) and that no producer text is in clear (T5).
92
+ - Record bytes: every record changes in its fingerprinted, decided and rendered fields only; claim ids, finding ids and
93
+ fingerprints, claim states, predicates and turns, the release state, readiness and every score number are unchanged
94
+ (the reviewed re-issue R3S). The golden JCS, the native vector's record and the self-test's FIN_3 record are re-issued.
95
+
96
+ ### Added (L3s)
97
+
98
+ - `eio_agents.resolve(rec, bundle)`, `eio-agents resolve RECORD BUNDLE` and `eio-agents explain RECORD TARGET --local
99
+ BUNDLE`: every withheld value with its real text from the local bundle (display only; nothing is added to the record).
100
+
101
+ ### Added
102
+
103
+ - Public documentation: a rewritten README, and `docs/` pages on concepts, the quick start, the Python API, the command
104
+ line, verification, standards coverage, and versioning with the roadmap steps L1 to L6.
105
+ - Project files: `CONTRIBUTING.md`, `CODE_OF_CONDUCT.md` (Contributor Covenant 2.1), `SECURITY.md`, `GOVERNANCE.md`,
106
+ `CITATION.cff`, `.gitignore` and `.gitattributes`.
107
+ - Package metadata: project URLs, keywords and classifiers.
108
+ - `py.typed`: the package is marked as typed (`Typing :: Typed`).
109
+ - Optional extras `lint` (ruff, pinned), `build` (build, twine) and `dev` (all tools, with pre-commit).
110
+ - Development tooling: ruff configuration in `pyproject.toml`, `.pre-commit-config.yaml` (byte-exact paths excluded), a
111
+ CI workflow (lint; tests on Python 3.10 to 3.14; minimum dependency versions; the built wheel tested alone in a clean
112
+ environment; goldens and conformance tools), a manual release workflow with PyPI trusted publishing, issue and pull
113
+ request templates, Dependabot configuration and CODEOWNERS.
114
+ - L2a (structure only; record bytes unchanged): `eio_agents.base`, the bottom layer (`base.canon`: JCS, `stable_digest`,
115
+ sha256 strings, number rules; `base.errors`: `ConversionError`, `require`). `eio_agents.adapters`, the producer-adapter
116
+ interface (`ProducerAdapter` protocol with `name`, `version`, `kind = "adapter"`, `to_bundle(raw) -> dict`, and
117
+ `adapter_metadata`), with no registry, no discovery and no entry points. `Ontology.witnessing_anchored(ref)`.
118
+ `convert`, `convert_file` and `verify` take `*, ontology=None`. New tests: `tests/test_layering.py` (the import
119
+ direction of every module, and fresh-process checks that neutral subpackages never load the staging area) and
120
+ `tests/test_adapters.py`.
121
+
122
+ - L2b (the seam split; record bytes unchanged): the evaluation bundle, archive schema 3 draft 1, as a JSON Schema
123
+ (`eio_agents.schemas.bundle_schema()`, `schemas/bundle/bundle-3.0.0-draft.1.schema.json`), with the contract sections
124
+ header, provenance, sources, scope, context_assessment, graph, claims, ballots, trials, stage_records and limitations,
125
+ plus the adapter-only `producer_declared` section (scenario labels and severity, the producer capability registry, the
126
+ resolved context-link rows and the generic score-input section `{axis, value, components [{id, value}]}`).
127
+ `eio_agents.per.project(bundle, *, ontology=None)`, the neutral projection: section validation, the producer-declared
128
+ acceptance rule (rejected for `kind: native`, `PRODUCER_DECLARED_NOT_ACCEPTED`), stage-record digests, recompute of
129
+ claim ids, span and receipt refs and pooled votes, then the views. A bundle without score inputs projects `scores` as
130
+ null. Neutral halves of the split plan §3.10 seams: `adjudication.pool`, `adjudication.invalid_because`,
131
+ `semantics.scope.qualify`, `semantics.claims.make_claim`, `semantics.findings.findings`, `semantics.proof.claim_proven`
132
+ (rc1 rule unchanged), `semantics.release.gates` and `release`, `semantics.coverage.census`,
133
+ `compliance.select_frameworks`, `resolvers.natural_resolver`, `reliability.reliability_block` over trial records,
134
+ `scoring.ScoreView`, the ref constructors `evidence.refs.span_ref`, `receipt_ref`, `computed_ref`, and `per.header`.
135
+ `ConversionError.code` (the typed error code). The staged adapter `eio_agents._legacy.old_report_converter.to_bundle(raw)`.
136
+ Frozen X-TWIN vectors: `tests/data/bundles/` (3 goldens, 4 stress archives, `SHA256SUMS`), re-frozen with
137
+ `tests/freeze_bundles.py`; new tests `tests/test_bundle.py`.
138
+
139
+ - L2c (the neutral API; record bytes unchanged: the 3 goldens, 4 stress and 6 replay records equal R0):
140
+ `eio_agents.validation.validate(rec)`, `validate_bundle(bundle)`, `check_one(rec)` and `verify(rec, bundle, *,
141
+ rederived)`, all in process. `eio_agents.verify(rec, bundle)` re-projects the bundle in process and checks it with the
142
+ independent verifier, including VER-5 per locator kind over the bundle's `sources` (turn spans, tool receipts, typed
143
+ absences, context spans and absences, the declared archive pointer, turn digests, claim decisions). Contract §6.2 step
144
+ 7: `per.project` validates the record it returns (the PER schema and the release's ids; typed code `PER_INVALID`),
145
+ accepting only the rc1 requirements that carry ProofAgent vocabulary for a native producer, listed with their §5.3 row
146
+ in `per/data/rc1_only.json`. Closed vocabularies of the loaded release checked on every bundle (claim states, evidence
147
+ kinds, source types and anchors, tier, region, autonomy, domains, facts, frameworks, the policy object, severities, and
148
+ the claims, turns and predicates that declared items name; codes `BUNDLE_VOCABULARY` and `BUNDLE_SCOPE`). The witness
149
+ flag and anchor of every ref are recomputed from the release; a turn span must point into the declared turn source; a
150
+ native producer mints no juror citation. `eio_agents.semantics.release.RELEASE_SEMANTICS` (the release-semantics
151
+ version, a core constant) and `metric_label` (gate reasons name the `eio.metric.*` id when no label is declared).
152
+ `eio_agents.scoring.published_metric_set` (the published metric set is the declared scoring profile's; the harness-2.x
153
+ profile data declares the six metrics that carry a harness metric key). `python -m eio_agents`. X-NATIVE vector:
154
+ `tests/data/native/` (a hand-authored native bundle, its expected PER and its pinned rc1-only problem list, written by
155
+ `author_native.py` with EIO-Agents only). New tests: `tests/test_native.py`, `tests/test_verify.py`,
156
+ `tests/test_neutral_constants.py` (the L2 exit AST/constant test with its exact allowlist).
157
+
158
+ - L2 fix round 1 (the fixes of the final L2 verification; record bytes unchanged: the 3 goldens, 4 stress and 6 replay
159
+ records equal R0, and the X-NATIVE record and its pinned problem list are unchanged): the builders
160
+ `evidence.refs.no_matching_call_ref` (the typed absence of a named tool call over listed turns) and
161
+ `evidence.context_refs.policy_span_ref` (a POLICY_SPAN over a span of an embedded context artifact; the projector's
162
+ context lines use it); `per.bundle.accept_native`, `check_episodes` and `check_native_sources`;
163
+ `per.projection.ProjectionRefStore`. New tests: the verifier's probes and the new rules as `INVALID` cases in
164
+ `tests/test_bundle.py` (among them the 13 bundles that crashed untyped), tests that a declared ref that recomputes is
165
+ accepted, the relaxation rows pinned to their exact rc1 errors (`tests/test_native.py`), the verifier twin of the new
166
+ rules (`tests/test_verify.py`), and the pinned Report-key exclusion set of the AST/constant test.
167
+
168
+ - L2 fix round 2 (the fixes of the re-verification of L2; record bytes unchanged: the 19 R0 inputs, the 7 frozen
169
+ bundles, the 3 goldens, the X-NATIVE record and its pinned problem list, and the rule-6 context vector):
170
+ `per.bundle.check_names` (step 1, the name rules), `per.bundle.check_context_search` (the context-search recompute shared
171
+ by gaps and absences), `per.bundle.loads` and `validation.validate.loads_bundle` (bundle text as I-JSON), and
172
+ `per.evidence.ref_key` (the 03 §5.6 rule 1 key). New tests: `tests/test_reverify_l2.py` (every (kind, source type,
173
+ anchor) combination of the release, in the projector and in the verifier twin; the re-verification probes; the R-3
174
+ ordering; the I-JSON reader) and 35 `INVALID` cases in `tests/test_bundle.py`.
175
+
176
+ - L3 (the ProofAgent adapter leaves EIO-Agents; record bytes unchanged: the 19 R0 inputs through the adapter, the 3
177
+ goldens, the 10 frozen bundles, the X-NATIVE record and its pinned problem list): the ProofAgent adapter (the legacy
178
+ crosswalk, the archive schema 1/2 reader, the recipes, the report converter and the legacy verifier) lives in the
179
+ ProofAgent Harness as `proofagent_harness.eio_adapter` (`to_bundle`, `convert_legacy`, `verify_legacy`,
180
+ `ADAPTER_VERSION`), with its tests and fixtures; `_legacy/` holds only the vendored-scorer loader `harness2x` until L4.
181
+ The frozen context bundles `tests/data/bundles/context/` (the FIN_3 and MED_1 bundles with the FIN agent's three
182
+ artifacts, embedded or by digest) replace the stored-report inputs of the neutral tests. The fixes of the L2 exit
183
+ deviations D-29 to D-35 (the final L2 re-verification, F-1 to F-13): `Ontology.data_classes` and
184
+ `Ontology.artifact_kinds` and the verifier reader's own copies; `evidence.refs.state_fact_ref` (a STATE_FACT over a
185
+ declared state snapshot), `evidence.refs.CALL_TERM` and `QUOTE_ANCHORS`; `evidence.context_refs.withheld`,
186
+ `EXCERPTABLE`, `confidential_digests`, `effective` and `casefold_offsets`; `semantics.proof.w1_unmet`;
187
+ `validation.checker.Checker.proof_candidate`; bundle schema draft 1 gains the optional `sources.state_field` and
188
+ `turns[].state` (no frozen bundle changes). New tests: `tests/test_l2_exit_deviations.py` and 30 `INVALID` cases in
189
+ `tests/test_bundle.py` (the re-verification's probes T01-T31 that now fail closed).
190
+
191
+ ### Changed
192
+
193
+ - L3. `convert` takes an evaluation bundle only: a stored ProofAgent Harness report (archive schema 1 or 2) is refused
194
+ with `BUNDLE_INPUT`, whose message names its converter (`proofagent_harness.eio_adapter.convert_legacy`); the
195
+ stored-report branch of D-4 and its lazy import of `_legacy` are deleted. `harness2x` no longer imports the legacy
196
+ crosswalk (its `lx` argument is read by duck typing). The self-test's neutral share (31 of the 53 injected defects) stays
197
+ here; the adapter's share (22) runs in the harness. Rule changes, each byte-neutral for every gated input, that fail
198
+ closed where L2 failed open or untyped (L2 exit D-29 to D-35): a context artifact's data class and kind must be ids of
199
+ the release (`BUNDLE_VOCABULARY`; an unknown class read as not confidential); a lone surrogate in bundle text or in a
200
+ string of a dict bundle is `BUNDLE_INPUT` (it reached an untyped `UnicodeEncodeError`), a float tool-call index is
201
+ `BUNDLE_RECOMPUTE` (untyped `TypeError`), and a citation key inside a free-form producer field is `PER_INVALID` (untyped
202
+ `KeyError`); a declared ref carries no statement (a declared CALCULATION or TYPED_ABSENCE never converts); PROD-43 reads
203
+ an artifact as the most restrictive declaration of its bytes, and withholds the excerpt of every data class but
204
+ `eio.data.public` and `eio.data.internal` (read fail-closed; the spec names model-confidential); a context text whose
205
+ casefold changes its length is searched through an offset map instead of being skipped (it gave false absences); a
206
+ state fact over a declared state snapshot is rebuilt (the adapter's R-PERSIST recipe converts again, with the frozen
207
+ eio-per oracle's bytes); a claim whose contract check records `no_witnessing_ref` is not PROVEN (W1); named-call terms
208
+ are lower-case ASCII names; an exact or casefold span quotes at least one character; a context-artifact name is in NFC
209
+ (`BUNDLE_SCHEMA` at step 1); a context-search term is plain text and a searched name does not spell an embedded
210
+ artifact's name another way; the same policy text at the same offsets of two artifacts fails closed with its name
211
+ (the 03 §6 collision rule is not implemented until S5). The verifier applies each rule independently (`validate_bundle`
212
+ B0, B1, B3; VER-5 in `D2`; the W1 precondition in `F1` and the cap check).
213
+
214
+ - L3 fix round 1 (an adversarial verification of the rules above; record bytes unchanged for every gated input). Every
215
+ producer-chosen text that reaches the record is the bundle's or the release's: the layout names `turn_source_ref`,
216
+ `calls_field` and `state_field` are identifiers (`BUNDLE_SCHEMA`), the archive and argument pointers hold identifier
217
+ and index tokens; a ref that no recipe rebuilds names a source the bundle declares (the turn source, the state field,
218
+ a context artifact, a retrieval source) and carries no tool receipt; a native producer's context search names declared
219
+ artifacts with release checklist terms (the gap's control's); an adapter producer may also name a portable file that
220
+ it does not declare and search a printable ASCII phrase of its own checklist; a named-call term is at most 64
221
+ characters; a term that is not a release checklist term (nor, for a named call, part of a declared tool name or tool
222
+ schema) and an undeclared name reproduce no confidential content the bundle carries: three consecutive words of a
223
+ withheld artifact's text, or a whole tool-call or state value that identifies (two words, a digit or an '@')
224
+ (`per.bundle.Withheld`); scenario labels and context-link keys are labels and a context link's `via` is its link
225
+ (`BUNDLE_RECOMPUTE`, `BUNDLE_VOCABULARY`). The record's `provenance.inputs.context_artifacts` must be the bundle's
226
+ `sources.context_artifacts`. PROD-43 withholds the same text in another normal form or with other line ends
227
+ (`evidence.context_refs.normalized_digest`). An integer too long for Python to read or beyond the IEEE 754 double
228
+ range, and in a dict bundle a value JSON has not (a tuple, a set, bytes, an integer member name), are `BUNDLE_INPUT`,
229
+ and the canonical form types such an integer `NON_FINITE` (they raised untyped). A context search reads 'İ' as 'i'
230
+ (`evidence.context_refs.fold`). A STATE_FACT witnesses only a predicate whose evidence contract names STATE_FACT
231
+ (`semantics.proof.witnesses`). The verifier applies each rule with its own code (B0, B1, B3, A1, C3, D2, F1). New tests:
232
+ 12 in `tests/test_l2_exit_deviations.py` and 53 `INVALID` cases in `tests/test_bundle.py` (`L3r1`).
233
+
234
+ - L3 fix round 2 (a second verification of the rules above; record bytes unchanged for every gated input). The names a
235
+ record carries hold no withheld content in any spelling: the declared context-artifact names (a ref's `source_ref`, a
236
+ context search's file names, `provenance.inputs`, the AI-BOM), the layout names, the archive-pointer keys and pointers,
237
+ tool-call names and retrieval sources, scenario labels and context-link keys (`per.bundle.check_withheld_names`,
238
+ `BUNDLE_RECOMPUTE`); a text is read verbatim, normalized (NFKD, invisible characters dropped, look-alike letters read
239
+ as Latin), case-folded and snake, kebab and camel case folded (`per.bundle.words`). The record-wide rule: no string of
240
+ the record, nor of the bundle where a record carries it in clear, carries withheld content (`WITHHELD_CONTENT`), outside
241
+ three named exemptions (the PROD-42 excerpt of a turn span, the agent's goal and role, a tool-call name that a
242
+ withheld text names as a whole token). An undeclared searched name is exempt from the artifact-text rule only when it
243
+ equals a declared artifact's file name, and only a public or internal tool schema exempts a named-call term. A
244
+ limitation's field path is one of its catalogue paths and a completed path names a value of the record (`PER_INVALID`,
245
+ as the verifier reads it); a human decision cites a HUMAN_SIGNOFF over HUMAN_REVIEW (`BUNDLE_RECOMPUTE`). The verifier
246
+ applies each rule with its own code (`B3`, `C2`, `D2`), and `validate_bundle` names a data class that is not of the PER
247
+ schema's form; a policy excerpt is checked by the record-wide rule. A producer limitation whose parameters do not
248
+ fill its catalogue texts (`TEMPLATE_PARAMS`) and a score-input axis that names an unknown context criterion
249
+ (`BUNDLE_SCORE_INPUTS`) raised an untyped KeyError, and a limitation parameter named like an argument of the
250
+ projector's helper an untyped TypeError (the parameters are now read as a dict); `validate_bundle` names the first
251
+ two and an unknown limitation id (`B3`). New tests: 9 in `tests/test_l2_exit_deviations.py` (with the parametrized
252
+ twin-parity cases) and 40 `INVALID` cases in `tests/test_bundle.py` (`L3r2`).
253
+ - L3 fix round 3 (a third verification; record bytes unchanged for every gated input). The record-wide rule counts
254
+ PROD-42's identifying classes among the tool-call and state values that name a subject (`per.bundle.subject_value`,
255
+ `identifying_words`): a run of four digits or more, two number groups or more, a word of letters and digits
256
+ ('123-45-6789', '4111 1111 1111 1111', '312 555 0147', 'ACCT88419372', '0000'); a short plain number ('0.5', '42') and
257
+ one word ('lookup') stay out. A text is also read with its percent-encoding and JSON Pointer escapes decoded
258
+ (`per.bundle.decoded`). The tool-name exemption holds only for an identifier-shaped name of a tool the bundle observes
259
+ or a public or internal tool schema declares, that is not itself of an identifying class (a secret key or a URL token
260
+ of a withheld prompt is checked). A published reliability rate with a null value fails closed with `BUNDLE_SCHEMA` (an
261
+ untyped TypeError before); a claim's votes are null if and only if it is decided deterministically
262
+ (`BUNDLE_RECOMPUTE`, as the verifier's `C2` reads it). The verifier applies each rule with its own code (`B3`, `D2`),
263
+ and `validate_bundle` names a human decision without a HUMAN_SIGNOFF. New tests: 21 `INVALID` cases in
264
+ `tests/test_bundle.py` (`L3r3`) and 5 in `tests/test_l2_exit_deviations.py` (`test_r3_*`, with their parametrized
265
+ cases).
266
+ - L3 fix round 4 (a fourth verification; record bytes unchanged for every gated input). The subject rule reads every
267
+ scalar of the tool calls and state snapshots (a number as its JSON text: a card number sent as a JSON number) and the
268
+ PROD-42 identifying-class matches of the turns' questions and answers (`per.bundle.turn_subjects`), with every decimal
269
+ digit of any script read as its ASCII digit (`per.bundle.ascii_digit`) and JSON '\\u' escapes decoded
270
+ (`per.bundle.decoded`). New, the identifying-shape backstop (`per.bundle.shape_problems`, `WITHHELD_CONTENT`): no
271
+ string of the bundle that a record carries in clear holds an identifying-shaped token, known subject or not: four
272
+ digits or more whatever separates them, two digit groups or more, a word of six letters and digits or more, sixteen
273
+ hex characters or more, a base64 run, an e-mail address, a URL with credentials, a secret-key prefix; allowed only the
274
+ recorded forms of their fields (digests, claim and ref ids, run ids, short release digests, source revisions, the
275
+ configuration fingerprint, the checks version, run timestamps, versions), a string the release publishes, a short
276
+ plain decimal and the words 'base64' and 'sha256'; a ref's excerpt is PROD-42's. The verifier applies both with its
277
+ own code (`B3`, `D2`). New tests: 30 `INVALID` cases in `tests/test_bundle.py` (`L3r4`) and 6 in
278
+ `tests/test_l2_exit_deviations.py` (`test_r4_*`, with their parametrized cases).
279
+
280
+ - L2 fix round 2. A ref's witness flag and anchor count for proof only on a ref that `convert` rebuilds from the bundle's
281
+ own sources (a turn span, a tool receipt, a typed absence over the tool calls or over context artifacts, a policy span):
282
+ any other ref is accepted only as a non-witnessing ref that locates no text (no offsets, digests or excerpt), so a
283
+ CALCULATION, a typed absence over the answer or a state ledger, a state fact or a human sign-off with a witnessing
284
+ anchor, and a declared ref quoting a source the bundle does not carry fail closed (`BUNDLE_RECOMPUTE`). A turn ref that
285
+ locates text is always a span of the turn; anchor `turn` cites the whole turn; anchors `line` and `document` belong to a
286
+ POLICY_SPAN. Every name the sources are resolved by names one item: a turn index or a context-artifact name given twice,
287
+ or `context_texts` that are not exactly the embedded artifacts' texts, fail with `BUNDLE_SCHEMA`, and bundle text is read
288
+ as I-JSON (an object member given twice, a NaN or infinite number, undecodable bytes: `BUNDLE_INPUT`; before,
289
+ `per.project` leaked `UnicodeDecodeError`). A bundle nested more than 100 levels fails closed at read time
290
+ (`BUNDLE_INPUT`; before, some depths raised an untyped `RecursionError` late in the projection, whatever the caller's
291
+ stack), and the stored-report branch no longer leaks `RecursionError`. A context gap or
292
+ absence recomputes over every embedded file it names, whatever else it names, and a context absence is always the
293
+ builder's ref. The named-call absence takes non-empty lower-case names only (builder `INVARIANT`, projector
294
+ `BUNDLE_RECOMPUTE`). The evidence block orders refs by the rule 1 key, so a context line that only the scores step
295
+ derives (the Q axis's lines) is placed by the rule instead of raising an untyped `KeyError`. The JCS number and string
296
+ errors and the template parameter error carry their codes (`NON_FINITE`, `LONE_SURROGATE`, `TEMPLATE_PARAM_TYPE`). The
297
+ verifier: VER-5 applies the same rules (names, I-JSON, the declared-ref rule, the whole-turn anchor, receipts over the
298
+ tool-call list, the full statement of an absence, context absences over every embedded file, the nesting limit);
299
+ `validate_bundle` reports bundle text that is not I-JSON or nests too deep (`B0`) and the name rules (`B1`); `verify`
300
+ reports a record without a canonical form (a NaN, nesting too deep) as a failing row instead of raising. The command
301
+ line checks a bundle file from its bytes (`validate`), and a JSON list or nesting too deep no longer gives a traceback.
302
+
303
+ - L2 fix round 1. `convert` recomputes the computed statements and policy spans of a bundle (contract §6.2 step 2): a
304
+ typed absence over the declared tool calls (the whole ref, rebuilt from sources; a true absence counts 0), a typed
305
+ absence and a context gap over embedded context artifacts, and a POLICY_SPAN, which must point into a declared,
306
+ embedded artifact (no excerpt of model-confidential text, PROD-43). A declared ref with the id of a ref the projector
307
+ derives must be that ref (typed code `BUNDLE_RECOMPUTE`); the shared `RefStore` is unchanged. Until S7 the bundle's
308
+ `graph.episodes` must be the scenario-label grouping of its turns, an unlabelled turn being its own episode. A native
309
+ producer's bundle is its own archive: a declared `header.source_archive` is rejected (`PRODUCER_DECLARED_NOT_ACCEPTED`),
310
+ every stage record must be `producer: native` (`BUNDLE_STAGE_RECORDS`), and its archive pointer, tool-call pointers and
311
+ `transcript_sha256` must recompute from the bundle. Every turn ref, with or without text, must name the declared turn
312
+ source, and every ref's turn must be a turn of the bundle; a turn carries one scenario label; `header.eio` must name the
313
+ loaded release when the stage digests are checked. The step-7 relaxation rows (`per/data/rc1_only.json`) are pinned to
314
+ their exact rc1 errors (no row accepts any message). Bundle schema draft 1 types `ref.tool` (the receipt, required on a
315
+ TOOL_RECEIPT), `ref.statement` (required on a TYPED_ABSENCE), `ref.source_ref` (a string), `ref.span_sha256` and
316
+ `ref.source_sha256` (a digest or null) and `parameters.votes` (null, or non-negative integer counts), so these
317
+ schema-valid bundles fail with `BUNDLE_SCHEMA` instead of an untyped exception. The verifier: VER-5
318
+ also fails a POLICY_SPAN outside the declared artifacts, a turn ref without text outside the declared turn source, an
319
+ episode absence over turns the bundle lacks, and an absence that counts more than 0; the episode of a claim is the
320
+ union of its turns' episodes. `validate_bundle` checks the native-producer rules, and its documentation states that it
321
+ does not recompute.
322
+
323
+ - L2c: the proof rule reads the declared `parameters.fidelity`: a claim is `PROVEN` iff it is decided deterministically or
324
+ by a human, cites a witnessing anchored ref, and its fidelity is `exact` or its recurrence band `CONFIRMED`. The rc1
325
+ exemption for a claim without a source key is deleted, in the projector and in the verifier; a claim whose declared
326
+ fidelity differs from its rc1 `mapping_relation` fails closed. The verifier's mixed checks are split at their seams:
327
+ the neutral halves (header, EIO ids, domains, orders, claim parameters, findings, controls, scores, release,
328
+ reliability, limitations) are in `eio_agents.validation.checker.Checker`, the ProofAgent halves in
329
+ `_legacy.legacy_verifier.LegacyChecker` (its driver is now `rc1_check_one`). The command line is neutral: `eio-agents
330
+ project | validate | verify | explain | version`; `verify` takes `--bundle`, `validate` also checks a bundle, and a
331
+ missing file is reported without a traceback. `convert` takes JSON bytes or a dict (a path goes to `convert_file`);
332
+ bytes that are not a JSON object raise `ConversionError` with code `BUNDLE_INPUT`. `explain` returns only the
333
+ record's registered `eio.why.*` renderings, and raises `LookupError` for an unknown target or template. `standards()`
334
+ adds `ontology_sha256`, `per_schema_id`, `projector` and `version` (`per_schema` and `converter` are kept for one
335
+ version). A stored ProofAgent report still converts (until L3), through a lazy import, so a bundle never loads
336
+ `eio_agents._legacy`. Bundle schema draft 1: `header.adjudication_source`, `provenance.record.harness_llm`,
337
+ `sources.completeness.sentinel_locations` / `code_check_offsets`, `score_inputs.metrics[].legacy_metric` and
338
+ `sources.archive_pointer.archive_sha256` are optional (a native producer declares none of them); a metric `label` may
339
+ be null; the projector writes the archive digest into the record's archive pointer. A finding without scenario labels
340
+ has `traps: []` and fingerprint input null.
341
+ - Development status classifier `3 - Alpha`. Runtime dependencies have upper bounds: `pyyaml>=6.0,<7` and
342
+ `jsonschema>=4.20,<5`.
343
+ - `NOTICE` names EIO-Agents, gives the full revision and the correct pin location of the vendored ProofAgent Harness
344
+ files, and adds trademark, framework attribution and licence notes.
345
+ - The package license is declared as the SPDX expression `Apache-2.0`, with `LICENSE` and `NOTICE` as license files.
346
+ - Docstrings and comments no longer cite internal planning documents. The `convert` docstring now lists the exceptions it
347
+ can raise.
348
+ - L2a: the package root is lazy (PEP 562): `import eio_agents` imports no submodule, and `import eio_agents.ontology` (or
349
+ any other public subpackage) no longer loads `eio_agents._legacy`, `eio_agents._vendored` or `eio_agents.api`. The public
350
+ names of the root are unchanged. `api.py` no longer keeps a process-global `Ontology`: without `ontology=` each call
351
+ loads and verifies the bundled release. `ontology` imports only `base` and `schemas`: `STATES` and `norm_token` now live
352
+ in `eio_agents.ontology` (`semantics` re-exports `STATES`), and the witness rule is defined by `Ontology` (the
353
+ `evidence.witness` functions delegate to it), so `semantics` no longer imports `evidence`.
354
+
355
+ - L2b: `eio_agents.convert` projects an evaluation bundle (archive schema 3); a stored ProofAgent report (schema 1 or 2)
356
+ goes through the staged adapter first, `project(to_bundle(raw))`, with identical bytes. It also accepts JSON text. The
357
+ rc1 converter's ProofAgent reads (the policy step, intake, recipes, consensus log, reliability report, harness-2.x score
358
+ values and Report fields) now write bundle fields; everything after that reads only the bundle.
359
+ `evidence.refs.no_call_ref` takes `source_ref` and `calls_field` (no ProofAgent layout is assumed);
360
+ `reliability.band_of` reads a bundle trial record `{claim_id, ledger_key, trial_kind, reproduced_in, passes}`.
361
+ `CONVERTER` and `SCHEMA_URI` moved to `eio_agents.per.header` (the converter module re-exports them).
362
+
363
+ ### Removed
364
+
365
+ - L3: the modules `_legacy.legacy_crosswalk`, `_legacy.schema12_adapter`, `_legacy.legacy_recipes`,
366
+ `_legacy.old_report_converter` and `_legacy.legacy_verifier` (moved to `proofagent_harness.eio_adapter`); the recipe for
367
+ authoritative checker records (its records failed `validate()`; the adapter fails such an archive closed
368
+ with `CHECKER_AUTHORITATIVE_UNSUPPORTED`); the child-process regeneration of the legacy verifier (`GENERATOR`,
369
+ `c_regen`, `c_determinism`: the adapter's `verify_legacy` re-converts in process); `api._convert_stored_report`;
370
+ `tests/freeze_bundles.py` (the adapter's suite regenerates the frozen bundles).
371
+ - L2c: `api._archive_path` and `api._run_check` (temporary files and captured output); the subprocess re-conversion in
372
+ `verify` (the rc1 regeneration `c_regen` / `c_determinism` stays in `_legacy.legacy_verifier` for its own command line);
373
+ the `convert` command (`project` replaces it); reading a path or JSON text in `convert`.
374
+ - Two unused imports in the tests.
375
+ - L2b: `eio_agents.scoring.AX`, the harness-2.x axis-key table (the score inputs are keyed by EIO axis id).
376
+ - L2a: the modules `eio_agents.errors` and `eio_agents.semantics.canon` (moved to `eio_agents.base.errors` and
377
+ `eio_agents.base.canon`; no alias), and `norm_token` from `eio_agents.semantics.scope` (now in `eio_agents.ontology`).
378
+
379
+ ## [0.1.0.dev1] - 2026-09-28
380
+
381
+ Bundles EIO 0.4.0 and PER 2.0.0-rc1. Record bytes change: no; the golden records are byte-identical to `0.1.0.dev0`.
382
+
383
+ ### Added
384
+
385
+ - Console script `eio-agents` (it replaces `per`); `eio-agents version` prints the library version, which is the
386
+ distribution version (tested).
387
+ - `eio_agents.ontology.load()` returns an explicit `Ontology` object. Every call reads and verifies the release and
388
+ returns a new object; there is no process-global cache.
389
+ - `eio_agents.validation`: the independent parts of the reference verifier (its own canonical form and digests, EIO
390
+ reader, limitation catalogue, explanation renderer, PER Pointers, redaction and gate rules, the record-level checks, and
391
+ `explain`). It imports no converter module (tested).
392
+ - `tools/eio_digests.py`, which computes and checks `RELEASE-DIGESTS.json`, and `tools/eio_gates.py`, which runs the 37
393
+ EIO build gates and their 40 negative vectors against the bundled release.
394
+ - The verifier self-test (53 injected defects) as `tests/test_verifier_selftest.py`, with its fixtures bundled.
395
+ - A dependency test: no module outside the vendored scorer and its loader imports ProofAgent Harness, imports it
396
+ dynamically, writes `sys.modules`, loads code by path or discovers plugins.
397
+
398
+ ### Changed
399
+
400
+ - Distribution renamed to `eio-agents`, import package `eio_agents`.
401
+ - The package is split into neutral subpackages (`ontology`, `schemas`, `semantics`, `evidence`, `resolvers`,
402
+ `adjudication`, `reliability`, `compliance`, `scoring`, `per`, `validation`). The code that reads ProofAgent Harness
403
+ reports is staged in `_legacy`, and the vendored harness-2.x scorer is in `_vendored` (step L1; see
404
+ [docs/versioning.md](docs/versioning.md#roadmap-steps)).
405
+ - The EIO data moved to `ontology/data/`, and the EIO and PER schemas to `schemas/eio/` and `schemas/per/`, byte for byte.
406
+ - The limitation catalogue (48 ids) is a data file, `per/data/limitations.json`. Nothing parses Markdown at run time.
407
+ - The verifier reads only the bundled release: it has no environment variable and no default path into another
408
+ repository.
409
+ - The public API is unchanged.
410
+
411
+ ### Removed
412
+
413
+ - The standards sync tool: this repository is where the EIO data and schemas are authored.
414
+ - The standalone explanation script, superseded by `explain`.
415
+
416
+ ## [0.1.0.dev0] - 2026-09-27
417
+
418
+ Bundles EIO 0.4.0 (`ontology_digest` `ed5389af5235e4b8`) and PER 2.0.0-rc1. First package.
419
+
420
+ ### Added
421
+
422
+ - `convert`, `validate`, `verify` and `explain`, and the `per` command line.
423
+ - Conversion and checking logic moved from the conformance tools of the PER 2.0 specification. It reproduces their golden
424
+ records byte for byte.
425
+
426
+ [Unreleased]: https://github.com/ProofAgent-ai/eio-agents/commits/main
@@ -0,0 +1,23 @@
1
+ cff-version: 1.2.0
2
+ message: "If you use EIO-Agents, please cite it as below."
3
+ type: software
4
+ title: "EIO-Agents: Evaluation Intelligence Ontology for AI Agents (reference library)"
5
+ version: 0.6.0rc1
6
+ license: Apache-2.0
7
+ repository-code: "https://github.com/ProofAgent-ai/eio-agents"
8
+ authors:
9
+ - name: "ProofAI LLC"
10
+ contact:
11
+ - name: "ProofAgent"
12
+ email: "support@proofagent.ai"
13
+ keywords:
14
+ - ai-agents
15
+ - agent-evaluation
16
+ - evaluation-record
17
+ - evidence
18
+ - verification
19
+ abstract: >-
20
+ Reference library for EIO (Evaluation Intelligence Ontology) and PER 2.0 evaluation records for AI agents.
21
+ A model-graded verdict can support but never prove a claim, and a computed per-predicate witness rule
22
+ decides which typed evidence can prove agent behaviour. Records are canonical and content-addressed, so
23
+ a recipient with the exact evaluation bundle and matching library release can re-derive a record and check its digest.
@@ -0,0 +1,131 @@
1
+ # Contributor Covenant Code of Conduct
2
+
3
+ ## Our Pledge
4
+
5
+ We as members, contributors, and leaders pledge to make participation in our
6
+ community a harassment-free experience for everyone, regardless of age, body
7
+ size, visible or invisible disability, ethnicity, sex characteristics, gender
8
+ identity and expression, level of experience, education, socio-economic status,
9
+ nationality, personal appearance, race, caste, color, religion, or sexual
10
+ identity and orientation.
11
+
12
+ We pledge to act and interact in ways that contribute to an open, welcoming,
13
+ diverse, inclusive, and healthy community.
14
+
15
+ ## Our Standards
16
+
17
+ Examples of behavior that contributes to a positive environment for our
18
+ community include:
19
+
20
+ * Demonstrating empathy and kindness toward other people
21
+ * Being respectful of differing opinions, viewpoints, and experiences
22
+ * Giving and gracefully accepting constructive feedback
23
+ * Accepting responsibility and apologizing to those affected by our mistakes,
24
+ and learning from the experience
25
+ * Focusing on what is best not just for us as individuals, but for the overall
26
+ community
27
+
28
+ Examples of unacceptable behavior include:
29
+
30
+ * The use of sexualized language or imagery, and sexual attention or advances of
31
+ any kind
32
+ * Trolling, insulting or derogatory comments, and personal or political attacks
33
+ * Public or private harassment
34
+ * Publishing others' private information, such as a physical or email address,
35
+ without their explicit permission
36
+ * Other conduct which could reasonably be considered inappropriate in a
37
+ professional setting
38
+
39
+ ## Enforcement Responsibilities
40
+
41
+ Community leaders are responsible for clarifying and enforcing our standards of
42
+ acceptable behavior and will take appropriate and fair corrective action in
43
+ response to any behavior that they deem inappropriate, threatening, offensive,
44
+ or harmful.
45
+
46
+ Community leaders have the right and responsibility to remove, edit, or reject
47
+ comments, commits, code, wiki edits, issues, and other contributions that are
48
+ not aligned to this Code of Conduct, and will communicate reasons for moderation
49
+ decisions when appropriate.
50
+
51
+ ## Scope
52
+
53
+ This Code of Conduct applies within all community spaces, and also applies when
54
+ an individual is officially representing the community in public spaces.
55
+ Examples of representing our community include using an official e-mail address,
56
+ posting via an official social media account, or acting as an appointed
57
+ representative at an online or offline event.
58
+
59
+ ## Enforcement
60
+
61
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be
62
+ reported to ProofAgent at support@proofagent.ai.
63
+ All complaints will be reviewed and investigated promptly and fairly.
64
+
65
+ All community leaders are obligated to respect the privacy and security of the
66
+ reporter of any incident.
67
+
68
+ ## Enforcement Guidelines
69
+
70
+ Community leaders will follow these Community Impact Guidelines in determining
71
+ the consequences for any action they deem in violation of this Code of Conduct:
72
+
73
+ ### 1. Correction
74
+
75
+ **Community Impact**: Use of inappropriate language or other behavior deemed
76
+ unprofessional or unwelcome in the community.
77
+
78
+ **Consequence**: A private, written warning from community leaders, providing
79
+ clarity around the nature of the violation and an explanation of why the
80
+ behavior was inappropriate. A public apology may be requested.
81
+
82
+ ### 2. Warning
83
+
84
+ **Community Impact**: A violation through a single incident or series of
85
+ actions.
86
+
87
+ **Consequence**: A warning with consequences for continued behavior. No
88
+ interaction with the people involved, including unsolicited interaction with
89
+ those enforcing the Code of Conduct, for a specified period of time. This
90
+ includes avoiding interactions in community spaces as well as external channels
91
+ like social media. Violating these terms may lead to a temporary or permanent
92
+ ban.
93
+
94
+ ### 3. Temporary Ban
95
+
96
+ **Community Impact**: A serious violation of community standards, including
97
+ sustained inappropriate behavior.
98
+
99
+ **Consequence**: A temporary ban from any sort of interaction or public
100
+ communication with the community for a specified period of time. No public or
101
+ private interaction with the people involved, including unsolicited interaction
102
+ with those enforcing the Code of Conduct, is allowed during this period.
103
+ Violating these terms may lead to a permanent ban.
104
+
105
+ ### 4. Permanent Ban
106
+
107
+ **Community Impact**: Demonstrating a pattern of violation of community
108
+ standards, including sustained inappropriate behavior, harassment of an
109
+ individual, or aggression toward or disparagement of classes of individuals.
110
+
111
+ **Consequence**: A permanent ban from any sort of public interaction within the
112
+ community.
113
+
114
+ ## Attribution
115
+
116
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage],
117
+ version 2.1, available at
118
+ [https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
119
+
120
+ Community Impact Guidelines were inspired by
121
+ [Mozilla's code of conduct enforcement ladder][Mozilla CoC].
122
+
123
+ For answers to common questions about this code of conduct, see the FAQ at
124
+ [https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
125
+ [https://www.contributor-covenant.org/translations][translations].
126
+
127
+ [homepage]: https://www.contributor-covenant.org
128
+ [v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
129
+ [Mozilla CoC]: https://github.com/mozilla/diversity
130
+ [FAQ]: https://www.contributor-covenant.org/faq
131
+ [translations]: https://www.contributor-covenant.org/translations