rexecop 0.2.2a0__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 (181) hide show
  1. rexecop-0.2.2a0/.cursor/rules/github-workflow-hybrid.mdc +69 -0
  2. rexecop-0.2.2a0/.github/workflows/ci.yml +92 -0
  3. rexecop-0.2.2a0/.github/workflows/publish.yml +44 -0
  4. rexecop-0.2.2a0/.gitignore +14 -0
  5. rexecop-0.2.2a0/.python-version +1 -0
  6. rexecop-0.2.2a0/CHANGELOG.md +199 -0
  7. rexecop-0.2.2a0/LICENSE +21 -0
  8. rexecop-0.2.2a0/OPERATOR_LAB_RUNBOOK.md +240 -0
  9. rexecop-0.2.2a0/OPERATOR_RUNBOOK.md +246 -0
  10. rexecop-0.2.2a0/PKG-INFO +231 -0
  11. rexecop-0.2.2a0/README.md +207 -0
  12. rexecop-0.2.2a0/docs/alpha-sign-off-record.md +45 -0
  13. rexecop-0.2.2a0/docs/alpha-sign-off.md +49 -0
  14. rexecop-0.2.2a0/docs/architecture.md +132 -0
  15. rexecop-0.2.2a0/docs/connector-contract.md +135 -0
  16. rexecop-0.2.2a0/docs/distribution.md +102 -0
  17. rexecop-0.2.2a0/docs/evidence-model.md +76 -0
  18. rexecop-0.2.2a0/docs/govengine-integration.md +74 -0
  19. rexecop-0.2.2a0/docs/known-limitations.md +86 -0
  20. rexecop-0.2.2a0/docs/operation-lifecycle.md +88 -0
  21. rexecop-0.2.2a0/docs/operator-scheduler-pattern.md +99 -0
  22. rexecop-0.2.2a0/docs/profile-contract.md +121 -0
  23. rexecop-0.2.2a0/docs/safety-model.md +61 -0
  24. rexecop-0.2.2a0/docs/sclite-integration.md +78 -0
  25. rexecop-0.2.2a0/examples/environments/small-public-unit-proxmox.example.yaml +32 -0
  26. rexecop-0.2.2a0/examples/environments/small-public-unit-proxmox.staging.example.yaml +68 -0
  27. rexecop-0.2.2a0/examples/profiles/http-health-fixture/connectors/health.yaml +5 -0
  28. rexecop-0.2.2a0/examples/profiles/http-health-fixture/intents/http_health_check.yaml +6 -0
  29. rexecop-0.2.2a0/examples/profiles/http-health-fixture/profile.yaml +30 -0
  30. rexecop-0.2.2a0/examples/profiles/http-health-fixture/validation_rules/http_health_check.yaml +14 -0
  31. rexecop-0.2.2a0/examples/profiles/http-health-fixture/workflows/http_health_check.yaml +19 -0
  32. rexecop-0.2.2a0/examples/profiles/tecrax-fixture/connectors/pbs.yaml +7 -0
  33. rexecop-0.2.2a0/examples/profiles/tecrax-fixture/connectors/proxmox.yaml +9 -0
  34. rexecop-0.2.2a0/examples/profiles/tecrax-fixture/intents/check_backup_status.yaml +7 -0
  35. rexecop-0.2.2a0/examples/profiles/tecrax-fixture/intents/restart_zabbix_agent.yaml +6 -0
  36. rexecop-0.2.2a0/examples/profiles/tecrax-fixture/profile.yaml +30 -0
  37. rexecop-0.2.2a0/examples/profiles/tecrax-fixture/validation_rules/check_backup_status.yaml +13 -0
  38. rexecop-0.2.2a0/examples/profiles/tecrax-fixture/validation_rules/restart_zabbix_agent.yaml +18 -0
  39. rexecop-0.2.2a0/examples/profiles/tecrax-fixture/workflows/check_backup_status.yaml +42 -0
  40. rexecop-0.2.2a0/examples/profiles/tecrax-fixture/workflows/restart_zabbix_agent.yaml +45 -0
  41. rexecop-0.2.2a0/pyproject.toml +65 -0
  42. rexecop-0.2.2a0/scripts/run_alpha_signoff_checks.sh +41 -0
  43. rexecop-0.2.2a0/scripts/secret_scan.sh +32 -0
  44. rexecop-0.2.2a0/scripts/validate_public_truth.py +196 -0
  45. rexecop-0.2.2a0/src/rexecop/__init__.py +3 -0
  46. rexecop-0.2.2a0/src/rexecop/__main__.py +4 -0
  47. rexecop-0.2.2a0/src/rexecop/adapters/__init__.py +1 -0
  48. rexecop-0.2.2a0/src/rexecop/adapters/govengine_port/__init__.py +19 -0
  49. rexecop-0.2.2a0/src/rexecop/adapters/govengine_port/adapter.py +19 -0
  50. rexecop-0.2.2a0/src/rexecop/adapters/govengine_port/client.py +161 -0
  51. rexecop-0.2.2a0/src/rexecop/adapters/govengine_port/contracts.py +88 -0
  52. rexecop-0.2.2a0/src/rexecop/adapters/govengine_port/static_adapter.py +39 -0
  53. rexecop-0.2.2a0/src/rexecop/adapters/sclite_port/__init__.py +26 -0
  54. rexecop-0.2.2a0/src/rexecop/adapters/sclite_port/contracts.py +149 -0
  55. rexecop-0.2.2a0/src/rexecop/adapters/sclite_port/emitter.py +408 -0
  56. rexecop-0.2.2a0/src/rexecop/adapters/sclite_port/execution_receipt_metrics.py +76 -0
  57. rexecop-0.2.2a0/src/rexecop/adapters/sclite_port/fixture_bundle.py +49 -0
  58. rexecop-0.2.2a0/src/rexecop/adapters/sclite_port/full_bundle.py +430 -0
  59. rexecop-0.2.2a0/src/rexecop/adapters/sclite_port/govengine_policy_bridge.py +31 -0
  60. rexecop-0.2.2a0/src/rexecop/adapters/sclite_port/placeholder_emitter.py +83 -0
  61. rexecop-0.2.2a0/src/rexecop/adapters/sclite_port/target_host.py +32 -0
  62. rexecop-0.2.2a0/src/rexecop/cli.py +376 -0
  63. rexecop-0.2.2a0/src/rexecop/connectors/__init__.py +17 -0
  64. rexecop-0.2.2a0/src/rexecop/connectors/base.py +35 -0
  65. rexecop-0.2.2a0/src/rexecop/connectors/capability.py +35 -0
  66. rexecop-0.2.2a0/src/rexecop/connectors/command_shape.py +30 -0
  67. rexecop-0.2.2a0/src/rexecop/connectors/composite_runtime.py +118 -0
  68. rexecop-0.2.2a0/src/rexecop/connectors/errors.py +14 -0
  69. rexecop-0.2.2a0/src/rexecop/connectors/fixture_loader.py +63 -0
  70. rexecop-0.2.2a0/src/rexecop/connectors/http_api.py +374 -0
  71. rexecop-0.2.2a0/src/rexecop/connectors/http_support.py +83 -0
  72. rexecop-0.2.2a0/src/rexecop/connectors/local_shell.py +126 -0
  73. rexecop-0.2.2a0/src/rexecop/connectors/mock_runtime.py +60 -0
  74. rexecop-0.2.2a0/src/rexecop/connectors/mutating.py +13 -0
  75. rexecop-0.2.2a0/src/rexecop/connectors/runtime.py +16 -0
  76. rexecop-0.2.2a0/src/rexecop/connectors/ssh_readonly.py +162 -0
  77. rexecop-0.2.2a0/src/rexecop/environment/__init__.py +4 -0
  78. rexecop-0.2.2a0/src/rexecop/environment/loader.py +20 -0
  79. rexecop-0.2.2a0/src/rexecop/environment/model.py +41 -0
  80. rexecop-0.2.2a0/src/rexecop/environment/sanitize.py +57 -0
  81. rexecop-0.2.2a0/src/rexecop/errors.py +10 -0
  82. rexecop-0.2.2a0/src/rexecop/escalation/__init__.py +5 -0
  83. rexecop-0.2.2a0/src/rexecop/escalation/package.py +31 -0
  84. rexecop-0.2.2a0/src/rexecop/evidence/__init__.py +4 -0
  85. rexecop-0.2.2a0/src/rexecop/evidence/event.py +22 -0
  86. rexecop-0.2.2a0/src/rexecop/evidence/manager.py +47 -0
  87. rexecop-0.2.2a0/src/rexecop/evidence/redaction.py +26 -0
  88. rexecop-0.2.2a0/src/rexecop/examples/__init__.py +1 -0
  89. rexecop-0.2.2a0/src/rexecop/examples/bootstrap_receipt.py +61 -0
  90. rexecop-0.2.2a0/src/rexecop/execution/__init__.py +6 -0
  91. rexecop-0.2.2a0/src/rexecop/execution/backend.py +29 -0
  92. rexecop-0.2.2a0/src/rexecop/execution/executor.py +114 -0
  93. rexecop-0.2.2a0/src/rexecop/execution/internal_registry.py +59 -0
  94. rexecop-0.2.2a0/src/rexecop/operation/__init__.py +12 -0
  95. rexecop-0.2.2a0/src/rexecop/operation/controller.py +554 -0
  96. rexecop-0.2.2a0/src/rexecop/operation/model.py +111 -0
  97. rexecop-0.2.2a0/src/rexecop/operation/plan.py +62 -0
  98. rexecop-0.2.2a0/src/rexecop/operation/state.py +72 -0
  99. rexecop-0.2.2a0/src/rexecop/orchestration/__init__.py +5 -0
  100. rexecop-0.2.2a0/src/rexecop/orchestration/orchestrator.py +589 -0
  101. rexecop-0.2.2a0/src/rexecop/profile/__init__.py +11 -0
  102. rexecop-0.2.2a0/src/rexecop/profile/contract.py +42 -0
  103. rexecop-0.2.2a0/src/rexecop/profile/loader.py +76 -0
  104. rexecop-0.2.2a0/src/rexecop/profile/resolver.py +69 -0
  105. rexecop-0.2.2a0/src/rexecop/profile/validation_rules.py +28 -0
  106. rexecop-0.2.2a0/src/rexecop/runtime_ops/__init__.py +19 -0
  107. rexecop-0.2.2a0/src/rexecop/runtime_ops/coordinator.py +108 -0
  108. rexecop-0.2.2a0/src/rexecop/runtime_ops/maintenance.py +38 -0
  109. rexecop-0.2.2a0/src/rexecop/runtime_ops/monitor.py +49 -0
  110. rexecop-0.2.2a0/src/rexecop/runtime_ops/queue.py +76 -0
  111. rexecop-0.2.2a0/src/rexecop/runtime_ops/rollback.py +71 -0
  112. rexecop-0.2.2a0/src/rexecop/runtime_ops/target_lock.py +98 -0
  113. rexecop-0.2.2a0/src/rexecop/runtime_ops/worker.py +141 -0
  114. rexecop-0.2.2a0/src/rexecop/secrets/__init__.py +17 -0
  115. rexecop-0.2.2a0/src/rexecop/secrets/port.py +7 -0
  116. rexecop-0.2.2a0/src/rexecop/secrets/resolver.py +66 -0
  117. rexecop-0.2.2a0/src/rexecop/storage/__init__.py +13 -0
  118. rexecop-0.2.2a0/src/rexecop/storage/factory.py +27 -0
  119. rexecop-0.2.2a0/src/rexecop/storage/file_store.py +106 -0
  120. rexecop-0.2.2a0/src/rexecop/storage/memory_store.py +75 -0
  121. rexecop-0.2.2a0/src/rexecop/storage/port.py +43 -0
  122. rexecop-0.2.2a0/src/rexecop/storage/sqlite_store.py +158 -0
  123. rexecop-0.2.2a0/src/rexecop/types.py +10 -0
  124. rexecop-0.2.2a0/src/rexecop/validation/__init__.py +5 -0
  125. rexecop-0.2.2a0/src/rexecop/validation/validator.py +130 -0
  126. rexecop-0.2.2a0/src/rexecop/workflow/__init__.py +4 -0
  127. rexecop-0.2.2a0/src/rexecop/workflow/loader.py +26 -0
  128. rexecop-0.2.2a0/src/rexecop/workflow/model.py +93 -0
  129. rexecop-0.2.2a0/src/rexecop/workflow/runner.py +165 -0
  130. rexecop-0.2.2a0/tests/conftest.py +28 -0
  131. rexecop-0.2.2a0/tests/delivery_scope.py +72 -0
  132. rexecop-0.2.2a0/tests/helpers/__init__.py +0 -0
  133. rexecop-0.2.2a0/tests/helpers/health_staging_http_server.py +50 -0
  134. rexecop-0.2.2a0/tests/helpers/staging_http_server.py +141 -0
  135. rexecop-0.2.2a0/tests/test_alpha_gate.py +59 -0
  136. rexecop-0.2.2a0/tests/test_alpha_signoff_gate.py +43 -0
  137. rexecop-0.2.2a0/tests/test_apply_gating.py +81 -0
  138. rexecop-0.2.2a0/tests/test_apply_gating_govengine_client.py +71 -0
  139. rexecop-0.2.2a0/tests/test_apply_vertical_slice_e2e.py +109 -0
  140. rexecop-0.2.2a0/tests/test_cli_plan_smoke.py +48 -0
  141. rexecop-0.2.2a0/tests/test_cli_smoke.py +18 -0
  142. rexecop-0.2.2a0/tests/test_composite_runtime_routing.py +140 -0
  143. rexecop-0.2.2a0/tests/test_connector_backend_plugins.py +81 -0
  144. rexecop-0.2.2a0/tests/test_delivery_coverage.py +69 -0
  145. rexecop-0.2.2a0/tests/test_evidence_manager.py +25 -0
  146. rexecop-0.2.2a0/tests/test_execution_receipt_honesty.py +141 -0
  147. rexecop-0.2.2a0/tests/test_fixture_bundle_isolation.py +104 -0
  148. rexecop-0.2.2a0/tests/test_govengine_adapter.py +32 -0
  149. rexecop-0.2.2a0/tests/test_govengine_client.py +101 -0
  150. rexecop-0.2.2a0/tests/test_http_api_connector.py +116 -0
  151. rexecop-0.2.2a0/tests/test_http_health_check_e2e.py +79 -0
  152. rexecop-0.2.2a0/tests/test_internal_action_registry.py +21 -0
  153. rexecop-0.2.2a0/tests/test_maintenance_window.py +21 -0
  154. rexecop-0.2.2a0/tests/test_memory_store.py +48 -0
  155. rexecop-0.2.2a0/tests/test_mock_connector_runtime.py +122 -0
  156. rexecop-0.2.2a0/tests/test_operation_controller.py +81 -0
  157. rexecop-0.2.2a0/tests/test_operation_plan.py +37 -0
  158. rexecop-0.2.2a0/tests/test_package_import.py +21 -0
  159. rexecop-0.2.2a0/tests/test_pause_resume.py +75 -0
  160. rexecop-0.2.2a0/tests/test_phase14_connectors.py +199 -0
  161. rexecop-0.2.2a0/tests/test_profile_contract.py +26 -0
  162. rexecop-0.2.2a0/tests/test_public_truth_consistency.py +75 -0
  163. rexecop-0.2.2a0/tests/test_queue.py +65 -0
  164. rexecop-0.2.2a0/tests/test_readonly_vertical_slice_e2e.py +39 -0
  165. rexecop-0.2.2a0/tests/test_receipt_export.py +67 -0
  166. rexecop-0.2.2a0/tests/test_retry_policy.py +97 -0
  167. rexecop-0.2.2a0/tests/test_rollback_contract.py +69 -0
  168. rexecop-0.2.2a0/tests/test_sclite_emitter.py +126 -0
  169. rexecop-0.2.2a0/tests/test_sclite_full_bundle.py +151 -0
  170. rexecop-0.2.2a0/tests/test_sclite_placeholder_emitter.py +65 -0
  171. rexecop-0.2.2a0/tests/test_secret_resolver.py +58 -0
  172. rexecop-0.2.2a0/tests/test_sqlite_store.py +77 -0
  173. rexecop-0.2.2a0/tests/test_staging_connectors_e2e.py +136 -0
  174. rexecop-0.2.2a0/tests/test_state_machine.py +30 -0
  175. rexecop-0.2.2a0/tests/test_storage_backends.py +88 -0
  176. rexecop-0.2.2a0/tests/test_target_lock.py +60 -0
  177. rexecop-0.2.2a0/tests/test_tecrax_profile_integration.py +70 -0
  178. rexecop-0.2.2a0/tests/test_validator.py +24 -0
  179. rexecop-0.2.2a0/tests/test_worker_runtime.py +90 -0
  180. rexecop-0.2.2a0/tests/test_workflow_loader.py +17 -0
  181. rexecop-0.2.2a0/tests/test_workflow_runner.py +94 -0
@@ -0,0 +1,69 @@
1
+ ---
2
+ description: Hybrid GitHub workflow for rozmiarD/RExecOP (PR vs push-to-main)
3
+ alwaysApply: true
4
+ ---
5
+
6
+ # GitHub workflow — hybrid hard rule
7
+
8
+ Repository: `rozmiarD/RExecOP` only. Never use other GitHub accounts or repos.
9
+
10
+ All remote git/gh operations MUST use:
11
+
12
+ ```bash
13
+ /home/probo/.openclaw/workspace/scripts/github-rozmiard-token.sh --exec -- <cmd>
14
+ ```
15
+
16
+ Never put `Co-authored-by` in commit messages.
17
+
18
+ ## Before any push
19
+
20
+ Run locally and fix failures first:
21
+
22
+ ```bash
23
+ ruff check .
24
+ mypy src/rexecop
25
+ pytest
26
+ ```
27
+
28
+ ## When to use PR + merge (default for roadmap work)
29
+
30
+ Use branch → push → PR → CI green → merge → sync `main` when ANY of:
31
+
32
+ - roadmap phase or milestone delivery
33
+ - new or changed dependencies (`pyproject.toml`)
34
+ - external integration (GovEngine, SCLite, connectors)
35
+ - non-trivial feature/refactor touching multiple modules
36
+
37
+ Branch naming: `phase-<id>-<short-topic>` or `fix-<short-topic>`.
38
+
39
+ ## When to push directly to `main`
40
+
41
+ Allowed only when ALL of:
42
+
43
+ - small follow-up after a merged PR (docs typo, test fix, review nits)
44
+ - no dependency or integration boundary changes
45
+ - local `ruff` + `mypy` + `pytest` already green
46
+
47
+ Still run CI on `main` after push; do not assume local-only green is enough.
48
+
49
+ ## Anti-tokenwaste PR checks
50
+
51
+ Prefer one status poll over blocking watch loops:
52
+
53
+ ```bash
54
+ gh pr checks <n> # single check; retry only if still pending
55
+ ```
56
+
57
+ Use `gh pr checks --watch` only when the user explicitly asks to wait.
58
+
59
+ ## After merge
60
+
61
+ ```bash
62
+ git checkout main && git pull origin main
63
+ ```
64
+
65
+ Update roadmap status in `/home/probo/projects/audit/rexecoproadmap.txt` when a phase completes.
66
+
67
+ ## On CI failure
68
+
69
+ Fix on the same branch/PR. Never force-push `main`. Never skip hooks unless the user explicitly requests it.
@@ -0,0 +1,92 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ pull_request:
6
+
7
+ jobs:
8
+ test:
9
+ runs-on: ubuntu-latest
10
+
11
+ steps:
12
+ - uses: actions/checkout@v4
13
+
14
+ - uses: actions/checkout@v4
15
+ with:
16
+ repository: rozmiarD/tecrax
17
+ path: tecrax
18
+ token: ${{ secrets.GITHUB_TOKEN }}
19
+
20
+ - uses: actions/setup-python@v5
21
+ with:
22
+ python-version: "3.11"
23
+
24
+ - name: Install
25
+ run: |
26
+ python -m pip install -e ./tecrax
27
+ python -m pip install -e ".[dev]"
28
+
29
+ - name: Validate public truth
30
+ run: python scripts/validate_public_truth.py
31
+
32
+ - name: Ruff
33
+ run: ruff check . --exclude tecrax
34
+
35
+ - name: Mypy
36
+ run: mypy src/rexecop
37
+
38
+ - name: Core boundary check
39
+ run: |
40
+ if rg -l 'tecrax_profile|import tecrax' src/rexecop; then
41
+ echo "domain import detected in rexecop core"
42
+ exit 1
43
+ fi
44
+ if rg -n 'rexecop-fixture-guard-key' src/rexecop/adapters/sclite_port/full_bundle.py; then
45
+ echo "fixture guard key must not ship in production full_bundle module"
46
+ exit 1
47
+ fi
48
+
49
+ - name: Secret scan (basic)
50
+ run: bash scripts/secret_scan.sh
51
+
52
+ - name: Package install smoke
53
+ run: |
54
+ rexecop version
55
+ rexecop --help
56
+
57
+ - name: Pytest
58
+ run: pytest
59
+
60
+ package-dry-run:
61
+ runs-on: ubuntu-latest
62
+ steps:
63
+ - uses: actions/checkout@v4
64
+
65
+ - uses: actions/setup-python@v5
66
+ with:
67
+ python-version: "3.12"
68
+
69
+ - name: Install build tooling and runtime dependencies
70
+ run: |
71
+ python -m pip install --upgrade pip build twine
72
+ python -m pip install "govengine>=0.12.2a0,<0.15" "sclite-core>=1.0.1,<1.1"
73
+
74
+ - name: Clean build artifacts
75
+ run: rm -rf dist build *.egg-info
76
+
77
+ - name: Build package
78
+ run: python -m build
79
+
80
+ - name: Check package metadata
81
+ run: python -m twine check dist/*
82
+
83
+ - name: Wheel install smoke
84
+ run: |
85
+ python -m venv /tmp/rexecop-wheel-smoke
86
+ /tmp/rexecop-wheel-smoke/bin/python -m pip install --upgrade pip
87
+ /tmp/rexecop-wheel-smoke/bin/python -m pip install \
88
+ "govengine>=0.12.2a0,<0.15" "sclite-core>=1.0.1,<1.1"
89
+ /tmp/rexecop-wheel-smoke/bin/python -m pip install dist/*.whl
90
+ /tmp/rexecop-wheel-smoke/bin/python -m pip check
91
+ /tmp/rexecop-wheel-smoke/bin/rexecop version
92
+ /tmp/rexecop-wheel-smoke/bin/python -c "import importlib.metadata as md, rexecop; assert md.version('rexecop') == rexecop.__version__"
@@ -0,0 +1,44 @@
1
+ name: Publish PyPI
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ inputs:
6
+ version:
7
+ description: Package version to publish (must match pyproject.toml)
8
+ required: true
9
+ default: "0.2.2a0"
10
+
11
+ permissions:
12
+ contents: read
13
+
14
+ jobs:
15
+ publish-rexecop:
16
+ runs-on: ubuntu-latest
17
+ steps:
18
+ - uses: actions/checkout@v4
19
+
20
+ - uses: actions/setup-python@v5
21
+ with:
22
+ python-version: "3.12"
23
+
24
+ - name: Validate version and public truth
25
+ run: |
26
+ python scripts/validate_public_truth.py
27
+ test "$(python -c 'import tomllib; print(tomllib.load(open("pyproject.toml","rb"))["project"]["version"])')" = "${{ inputs.version }}"
28
+
29
+ - name: Install build tooling
30
+ run: python -m pip install --upgrade pip build twine
31
+
32
+ - name: Build package
33
+ run: |
34
+ rm -rf dist build *.egg-info
35
+ python -m build
36
+
37
+ - name: Check metadata
38
+ run: python -m twine check dist/*
39
+
40
+ - name: Publish to PyPI
41
+ env:
42
+ TWINE_USERNAME: __token__
43
+ TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }}
44
+ run: python -m twine upload dist/*
@@ -0,0 +1,14 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ *$py.class
4
+ *.egg-info/
5
+ .eggs/
6
+ dist/
7
+ build/
8
+ .venv/
9
+ venv/
10
+ .mypy_cache/
11
+ .ruff_cache/
12
+ .pytest_cache/
13
+ .rexecop/
14
+ *.egg
@@ -0,0 +1 @@
1
+ 3.11
@@ -0,0 +1,199 @@
1
+ # Changelog
2
+
3
+ All notable changes to RExecOp (`rexecop`) are documented here.
4
+
5
+ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
6
+ Versioning: `0.1.0a0` declares the **alpha gate** (roadmap Phase 10). Prior `0.x.0a0` lines
7
+ tracked incremental roadmap delivery.
8
+
9
+ ## [0.2.2a0] - 2026-06-16
10
+
11
+ ### Public PyPI (`15.1c`) and documentation clarity
12
+
13
+ - Clarify stack diagram: GovEngine gates mutating admission; RExecOp projects lifecycle into SCLite artifacts
14
+ - Publish `rexecop` to PyPI; update [docs/distribution.md](docs/distribution.md) and public-truth validators
15
+ - Canonical delivery test scope (`pytest -m delivery`) and composite runtime routing tests (from `0.2.1a0` batch)
16
+
17
+ ## [0.2.1a0] - 2026-06-20
18
+
19
+ ### Domain connector backend plugin (`tecrax_proxmox`)
20
+
21
+ - `CompositeConnectorRuntime` routes `backend: <registered EP>` via `load_connector_backend_for_connector`
22
+ - Tecrax: `tecrax_proxmox` entry point builds Proxmox `http_api` config from templates
23
+ - Alpha sign-off: `docs/alpha-sign-off.md`, record template, `scripts/run_alpha_signoff_checks.sh`
24
+ - Delivery coverage: canonical scope in `tests/delivery_scope.py`, `pytest -m delivery`, `test_composite_runtime_routing.py`
25
+
26
+ ## [0.2.0a0] - 2026-06-18
27
+
28
+ ### Phase 15 — distribution & E2E runbook
29
+
30
+ - CI `package-dry-run` job: `python -m build`, `twine check`, wheel install smoke
31
+ - [docs/distribution.md](docs/distribution.md): source, wheel, Git URL, private index guidance
32
+ - `OPERATOR_LAB_RUNBOOK.md`: full profile → GovEngine → SCLite E2E walkthrough
33
+ - Lab sections for GovEngine adapter posture and evidence vs SCLite authority
34
+ - Worker smoke checklist; package build smoke aligned with CI
35
+
36
+ ## [0.1.5a0] - 2026-06-18
37
+
38
+ ### Phase 14 — connectors
39
+
40
+ - `http_api`: configurable retry backoff (`base_delay`, `max_delay`), action-level retry override
41
+ - `http_api`: optional pagination (`items_path`, `next_path`, `max_pages`)
42
+ - `http_api`: HTTP `error_class` mapping with redacted `body_snippet` on failures
43
+ - `local_shell_readonly`: allowlist validation via `govengine.execution.command_shape`
44
+ - `ssh_readonly` connector (temporary read-only allowlist; documented non-production policy path)
45
+ - Staging HTTP stub: paginated and transient/auth-error endpoints for lab tests
46
+ - Tecrax: `tecrax.connectors.proxmox.build_http_api_connector_config()` templates
47
+
48
+ ## [0.1.4a2] - 2026-06-17
49
+
50
+ ### Phase 13.3 — fixture path isolation
51
+
52
+ - `REXECOP_FIXTURE_GUARD_KEY` moved to `fixture_bundle.py` (tests/lab only)
53
+ - Production `emit_operation_bundle` skips kernel guard unless `REXECOP_KERNEL_GUARD_KEY` is set
54
+ - `emit_fixture_operation_bundle` for CI/lab bundles with fixture HMAC sidecar
55
+ - `export_placeholder_receipt` deprecated; implementation in `rexecop.examples.bootstrap_receipt`
56
+ - CI boundary grep: fixture key must not appear in `full_bundle.py`
57
+
58
+ ## [0.1.4a1] - 2026-06-17
59
+
60
+ ### Phase 13.2 — execution receipt honesty
61
+
62
+ - `executed_command_count` and `network_execution_performed` derived from connector
63
+ `step_completed` evidence and `shared_state.connector_results`
64
+ - Ticket `max_runs` aligned with planned connector step count; relaxed strict profile for multi-connector plans
65
+ - Dry-run receipts keep `receipt_does_not_claim_live_target_execution` non-claim
66
+ - E2E assertions on staging `http_api` receipts
67
+
68
+ ## [0.1.4a0] - 2026-06-17
69
+
70
+ ### Phase 13.1 — SQLite storage backend
71
+
72
+ - `SqliteStore` implementing `OperationStoragePort` for operations, plans, and evidence
73
+ - Storage factory: `REXECOP_STORAGE=file|sqlite` or CLI `--storage`
74
+ - SCLite bundles, receipts, approvals, queue, and locks remain on disk under `.rexecop/`
75
+ - Parametrized tests: file vs sqlite backend parity
76
+
77
+ ## [0.1.3a0] - 2026-06-17
78
+
79
+ ### Phase 12 — runtime worker & triggery
80
+
81
+ - `rexecop worker run` with `--once`, `--poll-interval`, `--max-iterations`, `--watch-inbox`
82
+ - `rexecop queue --drain` one-shot queue processing
83
+ - `rexecop trigger` from JSON stdin or CLI flags; evidence `operation_triggered`
84
+ - `docs/operator-scheduler-pattern.md` (systemd/cron pattern — host-owned scheduling)
85
+
86
+ ## [0.1.2a0] - 2026-06-17
87
+
88
+ ### Phase 11 — neutral core
89
+
90
+ - Internal action plugin registry (`rexecop.internal_actions` entry points)
91
+ - Connector fixture loader (`rexecop.connector_backends` entry points)
92
+ - Generic `MockConnectorRuntime` in core; domain mock moved to `tecrax` (`tecrax_fixture`)
93
+ - `http-health-fixture` profile + `http_health_check` golden-path E2E (http_api-only)
94
+ - `InMemoryStore` for tests; storage boundary documented
95
+ - `OPERATOR_LAB_RUNBOOK.md` for lab validation
96
+ - Requires `tecrax>=0.3.1a0` for domain handlers and offline fixture mock
97
+
98
+ ## [0.1.1a0] - 2026-06-17
99
+
100
+ ### Profile consolidation
101
+
102
+ - Tecrax RExecOp profile now ships in [`tecrax`](https://github.com/rozmiarD/tecrax) (`tecrax:profile_root`)
103
+ - Optional dependency `tecrax>=0.3.0a0` replaces `tecrax-profile`
104
+ - CI checks out `rozmiarD/tecrax` instead of `tecrax-profile`
105
+ - Docs and runbook updated; `tecrax-profile` repo retired
106
+
107
+ ## [0.1.0a0] - 2026-06-17
108
+
109
+ ### Alpha gate (Phase 10)
110
+
111
+ - Declares RExecOp **alpha** for operator evaluation with documented limits
112
+ - Adds `OPERATOR_RUNBOOK.md`, `docs/known-limitations.md`, `CHANGELOG.md`
113
+ - CI: basic secret scan (`scripts/secret_scan.sh`), package install smoke
114
+ - Version reset to `0.1.0a0` as the alpha release line
115
+
116
+ ### Included from Phases 0–9
117
+
118
+ - Operation core: state machine, `OperationPlan`, file storage, evidence with redaction
119
+ - GovEngine port: real `GovEngineClient` + bootstrap `StaticGovEngineAdapter`
120
+ - SCLite port: full GovEngine-integration bundle (scoped ticket v0.3, review pass)
121
+ - Vertical slices: `check_backup_status` (read-only), `restart_zabbix_agent` (apply)
122
+ - Orchestration: approve, pause, resume, cancel, retry, rollback, queue, target lock, maintenance
123
+ - External `tecrax-profile` package integration (`rexecop.profiles` entry point)
124
+ - Connectors: `mock`, `http_api`, `local_shell_readonly`; secrets port
125
+ - 97 pytest tests; document truth pass on README and `docs/`
126
+
127
+ ### Alpha claims
128
+
129
+ Allowed: GovEngine-bound control-plane, profile-defined workflows, SCLite emission on
130
+ completion, mock and `http_api` read-only paths.
131
+
132
+ Not claimed: production governance authority, full Tecrax product, HA scheduler, UI,
133
+ unmanned apply on critical targets.
134
+
135
+ ## [0.11.0a0] - 2026-06-17
136
+
137
+ ### Phase 9 — Production connectors
138
+
139
+ - `http_api` config-driven REST connector
140
+ - `local_shell_readonly` allowlisted commands
141
+ - `CompositeConnectorRuntime` and secrets port (`REXECOP_SECRET_*`, `REXECOP_SECRETS_FILE`)
142
+ - Staging environment template and E2E tests
143
+
144
+ ## [0.10.0a0] - 2026-06-17
145
+
146
+ ### Phase 8 — Tecrax profile package
147
+
148
+ - External `tecrax-profile` repo with `rexecop.profiles` entry point
149
+ - Profile resolver and declarative validation rules in profile YAML
150
+ - CI boundary grep for domain imports in core
151
+
152
+ ## [0.9.0a0] - 2026-06-16
153
+
154
+ ### Phase 6 — Operational maturity
155
+
156
+ - Target lock, FIFO queue, maintenance windows, rollback executor
157
+ - `OperationStoragePort` protocol; CLI `retry`, `rollback`, `queue`
158
+
159
+ ## [0.8.0a0] - 2026-06-16
160
+
161
+ ### Phase 5 — Apply vertical slice
162
+
163
+ - `restart_zabbix_agent` apply workflow; approve, pause, resume, retry, cancel
164
+
165
+ ## [0.7.0a0] - 2026-06-16
166
+
167
+ ### Phase 3C — Full SCLite bundle
168
+
169
+ - GovEngine-integration parity bundle; `review_bundle` pass
170
+
171
+ ## [0.6.0a0] - 2026-06-16
172
+
173
+ ### Phase 4 — Read-only vertical slice
174
+
175
+ - Orchestrator, mock connectors, `check_backup_status` E2E
176
+
177
+ ## [0.5.0a0] - 2026-06-16
178
+
179
+ ### Phase 3B — SCLite emitter
180
+
181
+ - Real SCLite artifact emission on completion path
182
+
183
+ ## [0.4.0a0] - 2026-06-16
184
+
185
+ ### Phase 3A — SCLite placeholder port
186
+
187
+ - Placeholder emitter with schema refs (deprecated path)
188
+
189
+ ## [0.3.0a0] - 2026-06-16
190
+
191
+ ### Phase 2B — GovEngine client
192
+
193
+ - Real `GovEngineClient` adapter
194
+
195
+ ## Earlier
196
+
197
+ - Phases 0–2A: repository bootstrap, operation core, static GovEngine gating
198
+
199
+ [0.1.0a0]: https://github.com/rozmiarD/RExecOP/compare/f483bed...75eb006
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 rozmiarD
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,240 @@
1
+ # Operator lab runbook
2
+
3
+ RExecOp `0.2.2a0` — validate neutral core, plugin boundaries, read-only paths, and the full
4
+ profile → GovEngine → SCLite emission path before apply.
5
+
6
+ Runtime data is written to `.rexecop/` in the **current working directory**. Run lab commands
7
+ from a dedicated directory (for example `~/lab/rexecop-runtime`) so artifacts stay isolated.
8
+
9
+ ## Prerequisites
10
+
11
+ | Item | Command / check |
12
+ |------|-----------------|
13
+ | Python 3.11+ | `python --version` |
14
+ | RExecOp | `pip install -e ".[dev]"` from repo root (see [docs/distribution.md](docs/distribution.md)) |
15
+ | Tecrax (domain plugins) | `pip install -e ../tecrax` |
16
+ | GovEngine / SCLite | Installed via rexecop dependencies |
17
+ | Secrets file | `~/.rexecop/secrets.yaml` mode `0600` |
18
+
19
+ ```bash
20
+ export REXECOP_SECRETS_FILE=~/.rexecop/secrets.yaml
21
+ rexecop version # 0.2.2a0
22
+ export REXECOP_STORAGE=sqlite # optional SQLite backend for operations/plans/evidence
23
+ python scripts/validate_public_truth.py
24
+ ```
25
+
26
+ ## Lab checklist
27
+
28
+ ### 1. Core boundary
29
+
30
+ - [ ] `python scripts/validate_public_truth.py` passes
31
+ - [ ] `ruff check . --exclude tecrax` passes
32
+ - [ ] `rg 'vm-101|proxmox|pbs|zabbix' src/rexecop` returns **no matches**
33
+ - [ ] `rg 'import tecrax' src/rexecop` returns **no matches**
34
+
35
+ ### 2. Secrets hygiene
36
+
37
+ - [ ] No plaintext tokens in git or committed `.rexecop/`
38
+ - [ ] Environment YAML uses `secret_ref` / `base_url_secret_ref` only
39
+ - [ ] After a run: `rg -i 'api_key|token|password' .rexecop/` shows only `[REDACTED]` or no hits
40
+
41
+ ### 3. http_api-only golden path (no domain internals)
42
+
43
+ Uses `examples/profiles/http-health-fixture` — single connector step, no Tecrax internal actions.
44
+
45
+ ```bash
46
+ pytest tests/test_http_health_check_e2e.py -q
47
+ ```
48
+
49
+ Manual path: copy a staging env with `backend: http_api` pointing at your `/health` endpoint.
50
+
51
+ - [ ] `plan` + `start` → `completed`
52
+ - [ ] `validate` → `passed: true`, rule `http_health_check.probe_ok`
53
+
54
+ ### 4. Tecrax offline fixture (bootstrap)
55
+
56
+ Requires `tecrax` installed (`rexecop.internal_actions` + `tecrax_fixture` mock).
57
+
58
+ ```bash
59
+ rexecop plan \
60
+ --profile examples/profiles/tecrax-fixture/profile.yaml \
61
+ --env examples/environments/small-public-unit-proxmox.example.yaml \
62
+ --intent check_backup_status \
63
+ --target all_critical_vms \
64
+ --mode dry_run
65
+
66
+ rexecop start --operation <id>
67
+ rexecop validate --operation <id>
68
+ ```
69
+
70
+ - [ ] Final state `completed`
71
+ - [ ] `.rexecop/sclite/<id>/` contains bundle artifacts
72
+ - [ ] No secrets in evidence JSON
73
+
74
+ ### 5. Tecrax product profile (optional)
75
+
76
+ ```bash
77
+ rexecop plan --profile tecrax --env <env> \
78
+ --intent check_backup_status --target all_critical_vms --mode dry_run
79
+ rexecop start --operation <id>
80
+ ```
81
+
82
+ ### 6. Staging HTTP (CI pattern)
83
+
84
+ ```bash
85
+ pytest tests/test_staging_connectors_e2e.py -q
86
+ ```
87
+
88
+ Uses local HTTP stub — same shape as production `http_api` config.
89
+
90
+ ### 7. Worker and queue smoke
91
+
92
+ ```bash
93
+ pytest tests/test_worker_runtime.py -q
94
+ # or manual:
95
+ rexecop worker run --once
96
+ rexecop queue --drain
97
+ ```
98
+
99
+ - [ ] Queue drain works without a long-running daemon
100
+ - [ ] Scheduling remains **host-owned** (systemd/cron) — see [docs/operator-scheduler-pattern.md](docs/operator-scheduler-pattern.md)
101
+
102
+ ### 8. Alpha sign-off
103
+
104
+ - [ ] Run `bash scripts/run_alpha_signoff_checks.sh`
105
+ - [ ] Complete human checklist in [docs/alpha-sign-off-record.md](docs/alpha-sign-off-record.md)
106
+ - [ ] Read [docs/alpha-sign-off.md](docs/alpha-sign-off.md)
107
+
108
+ ## Full E2E lab: profile YAML → GovEngine → SCLite bundle
109
+
110
+ This walkthrough uses the neutral `http-health-fixture` profile so domain plugins are optional.
111
+ It exercises planning, workflow execution, validation, and SCLite bundle emission.
112
+
113
+ ### Step 1 — Prepare environment
114
+
115
+ Copy the staging template outside git and point connectors at a reachable `/health` endpoint,
116
+ or run the pytest E2E which starts an embedded HTTP stub:
117
+
118
+ ```bash
119
+ pytest tests/test_http_health_check_e2e.py -q
120
+ ```
121
+
122
+ For a manual run, create `~/lab/http-health.env.yaml` with `backend: http_api` and a `health`
123
+ connector action (see `examples/environments/` patterns).
124
+
125
+ ### Step 2 — Plan
126
+
127
+ ```bash
128
+ mkdir -p ~/lab/rexecop-runtime && cd ~/lab/rexecop-runtime
129
+
130
+ rexecop plan \
131
+ --profile /path/to/RExecOP/examples/profiles/http-health-fixture/profile.yaml \
132
+ --env ~/lab/http-health.env.yaml \
133
+ --intent http_health_check \
134
+ --target local \
135
+ --mode dry_run
136
+ ```
137
+
138
+ Record `<operation-id>` from output.
139
+
140
+ For mutating `apply` plans, verify GovEngine decision events in evidence:
141
+
142
+ ```bash
143
+ rg 'govengine_decision' .rexecop/evidence/<operation-id>/ || true
144
+ ```
145
+
146
+ ### Step 3 — Start workflow
147
+
148
+ ```bash
149
+ cd ~/lab/rexecop-runtime
150
+ rexecop start --operation <operation-id>
151
+ rexecop status --operation <operation-id>
152
+ ```
153
+
154
+ Expect terminal state `completed` for the golden path.
155
+
156
+ ### Step 4 — Validate profile rules
157
+
158
+ ```bash
159
+ rexecop validate --operation <operation-id>
160
+ ```
161
+
162
+ Expect `passed: true` and rule `http_health_check.probe_ok`.
163
+
164
+ ### Step 5 — Inspect SCLite bundle (truth authority)
165
+
166
+ ```bash
167
+ ls -la .rexecop/sclite/<operation-id>/
168
+ ```
169
+
170
+ Expect contract artifacts, scoped ticket, receipt, and evidence sidecars. Receipt
171
+ `executed_command_count` should reflect connector steps on staging/http paths.
172
+
173
+ Compare with non-authoritative export:
174
+
175
+ ```bash
176
+ test -f .rexecop/receipts/<operation-id>.json && \
177
+ echo "receipt export is summary only — sclite/ is authoritative"
178
+ ```
179
+
180
+ ### Step 6 — History and redaction
181
+
182
+ ```bash
183
+ rexecop history --operation <operation-id>
184
+ rg -i 'api_key|token|password' .rexecop/evidence/<operation-id>/ || echo "no secret leaks"
185
+ ```
186
+
187
+ ## GovEngine adapter posture (production vs tests)
188
+
189
+ | Adapter | Production? | Where used |
190
+ | --- | --- | --- |
191
+ | `GovEngineClient` | **Yes** — default via `default_govengine_adapter()` | Operator hosts, real governance |
192
+ | `StaticGovEngineAdapter` | **No** — bootstrap/tests only | `tests/test_*`, local fixtures |
193
+
194
+ Rules:
195
+
196
+ - Do **not** configure `StaticGovEngineAdapter` on operator hosts.
197
+ - Pytest and vertical-slice tests may inject the static adapter to avoid external GovEngine
198
+ services — that is not a production governance boundary.
199
+ - Mutating `apply` requires a positive GovEngine admission decision **and** satisfied approval
200
+ state; see [docs/govengine-integration.md](docs/govengine-integration.md).
201
+
202
+ Verify default adapter in code/docs:
203
+
204
+ ```bash
205
+ rg 'StaticGovEngineAdapter' tests/ src/rexecop/adapters/govengine_port/
206
+ ```
207
+
208
+ Production CLI paths use `default_govengine_adapter()` unless tests inject a substitute.
209
+
210
+ ## Evidence vs SCLite truth
211
+
212
+ | Location | Role | Authority |
213
+ | --- | --- | --- |
214
+ | `.rexecop/evidence/<op>/` | Append-only redacted runtime events (`EvidenceManager`) | Operator telemetry / debugging |
215
+ | `.rexecop/sclite/<op>/` | Full GovEngine-integration bundle (`SCLiteArtifactEmitter`) | **Auditable truth** (SCLite) |
216
+ | `.rexecop/receipts/<op>.json` | Export summary pointing at sclite descriptors | **Not** parallel truth |
217
+ | `.rexecop/operations/`, `plans/` or `rexecop.db` | Runtime operation state (`file` or `sqlite` backend) | RExecOp operator store |
218
+ | `.rexecop/queue/`, `locks/` | Concurrency and run-now backlog | Ephemeral operator mechanics |
219
+
220
+ Evidence events include `govengine_decision_requested`, `step_completed`, `receipt_generated`.
221
+ SCLite owns review semantics (`verify_ticket_use`, review bundles). When both exist, treat
222
+ `sclite/` as authoritative for audit — see [docs/evidence-model.md](docs/evidence-model.md)
223
+ and [docs/sclite-integration.md](docs/sclite-integration.md).
224
+
225
+ ## Package build smoke
226
+
227
+ ```bash
228
+ python -m pip install build twine
229
+ rm -rf dist build *.egg-info
230
+ python -m build && python -m twine check dist/*
231
+ ```
232
+
233
+ CI runs the same checks in the `package-dry-run` job. Details: [docs/distribution.md](docs/distribution.md).
234
+
235
+ ## Related
236
+
237
+ - [OPERATOR_RUNBOOK.md](OPERATOR_RUNBOOK.md)
238
+ - [docs/architecture.md](docs/architecture.md)
239
+ - [docs/profile-contract.md](docs/profile-contract.md)
240
+ - [docs/distribution.md](docs/distribution.md)