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.
- rexecop-0.2.2a0/.cursor/rules/github-workflow-hybrid.mdc +69 -0
- rexecop-0.2.2a0/.github/workflows/ci.yml +92 -0
- rexecop-0.2.2a0/.github/workflows/publish.yml +44 -0
- rexecop-0.2.2a0/.gitignore +14 -0
- rexecop-0.2.2a0/.python-version +1 -0
- rexecop-0.2.2a0/CHANGELOG.md +199 -0
- rexecop-0.2.2a0/LICENSE +21 -0
- rexecop-0.2.2a0/OPERATOR_LAB_RUNBOOK.md +240 -0
- rexecop-0.2.2a0/OPERATOR_RUNBOOK.md +246 -0
- rexecop-0.2.2a0/PKG-INFO +231 -0
- rexecop-0.2.2a0/README.md +207 -0
- rexecop-0.2.2a0/docs/alpha-sign-off-record.md +45 -0
- rexecop-0.2.2a0/docs/alpha-sign-off.md +49 -0
- rexecop-0.2.2a0/docs/architecture.md +132 -0
- rexecop-0.2.2a0/docs/connector-contract.md +135 -0
- rexecop-0.2.2a0/docs/distribution.md +102 -0
- rexecop-0.2.2a0/docs/evidence-model.md +76 -0
- rexecop-0.2.2a0/docs/govengine-integration.md +74 -0
- rexecop-0.2.2a0/docs/known-limitations.md +86 -0
- rexecop-0.2.2a0/docs/operation-lifecycle.md +88 -0
- rexecop-0.2.2a0/docs/operator-scheduler-pattern.md +99 -0
- rexecop-0.2.2a0/docs/profile-contract.md +121 -0
- rexecop-0.2.2a0/docs/safety-model.md +61 -0
- rexecop-0.2.2a0/docs/sclite-integration.md +78 -0
- rexecop-0.2.2a0/examples/environments/small-public-unit-proxmox.example.yaml +32 -0
- rexecop-0.2.2a0/examples/environments/small-public-unit-proxmox.staging.example.yaml +68 -0
- rexecop-0.2.2a0/examples/profiles/http-health-fixture/connectors/health.yaml +5 -0
- rexecop-0.2.2a0/examples/profiles/http-health-fixture/intents/http_health_check.yaml +6 -0
- rexecop-0.2.2a0/examples/profiles/http-health-fixture/profile.yaml +30 -0
- rexecop-0.2.2a0/examples/profiles/http-health-fixture/validation_rules/http_health_check.yaml +14 -0
- rexecop-0.2.2a0/examples/profiles/http-health-fixture/workflows/http_health_check.yaml +19 -0
- rexecop-0.2.2a0/examples/profiles/tecrax-fixture/connectors/pbs.yaml +7 -0
- rexecop-0.2.2a0/examples/profiles/tecrax-fixture/connectors/proxmox.yaml +9 -0
- rexecop-0.2.2a0/examples/profiles/tecrax-fixture/intents/check_backup_status.yaml +7 -0
- rexecop-0.2.2a0/examples/profiles/tecrax-fixture/intents/restart_zabbix_agent.yaml +6 -0
- rexecop-0.2.2a0/examples/profiles/tecrax-fixture/profile.yaml +30 -0
- rexecop-0.2.2a0/examples/profiles/tecrax-fixture/validation_rules/check_backup_status.yaml +13 -0
- rexecop-0.2.2a0/examples/profiles/tecrax-fixture/validation_rules/restart_zabbix_agent.yaml +18 -0
- rexecop-0.2.2a0/examples/profiles/tecrax-fixture/workflows/check_backup_status.yaml +42 -0
- rexecop-0.2.2a0/examples/profiles/tecrax-fixture/workflows/restart_zabbix_agent.yaml +45 -0
- rexecop-0.2.2a0/pyproject.toml +65 -0
- rexecop-0.2.2a0/scripts/run_alpha_signoff_checks.sh +41 -0
- rexecop-0.2.2a0/scripts/secret_scan.sh +32 -0
- rexecop-0.2.2a0/scripts/validate_public_truth.py +196 -0
- rexecop-0.2.2a0/src/rexecop/__init__.py +3 -0
- rexecop-0.2.2a0/src/rexecop/__main__.py +4 -0
- rexecop-0.2.2a0/src/rexecop/adapters/__init__.py +1 -0
- rexecop-0.2.2a0/src/rexecop/adapters/govengine_port/__init__.py +19 -0
- rexecop-0.2.2a0/src/rexecop/adapters/govengine_port/adapter.py +19 -0
- rexecop-0.2.2a0/src/rexecop/adapters/govengine_port/client.py +161 -0
- rexecop-0.2.2a0/src/rexecop/adapters/govengine_port/contracts.py +88 -0
- rexecop-0.2.2a0/src/rexecop/adapters/govengine_port/static_adapter.py +39 -0
- rexecop-0.2.2a0/src/rexecop/adapters/sclite_port/__init__.py +26 -0
- rexecop-0.2.2a0/src/rexecop/adapters/sclite_port/contracts.py +149 -0
- rexecop-0.2.2a0/src/rexecop/adapters/sclite_port/emitter.py +408 -0
- rexecop-0.2.2a0/src/rexecop/adapters/sclite_port/execution_receipt_metrics.py +76 -0
- rexecop-0.2.2a0/src/rexecop/adapters/sclite_port/fixture_bundle.py +49 -0
- rexecop-0.2.2a0/src/rexecop/adapters/sclite_port/full_bundle.py +430 -0
- rexecop-0.2.2a0/src/rexecop/adapters/sclite_port/govengine_policy_bridge.py +31 -0
- rexecop-0.2.2a0/src/rexecop/adapters/sclite_port/placeholder_emitter.py +83 -0
- rexecop-0.2.2a0/src/rexecop/adapters/sclite_port/target_host.py +32 -0
- rexecop-0.2.2a0/src/rexecop/cli.py +376 -0
- rexecop-0.2.2a0/src/rexecop/connectors/__init__.py +17 -0
- rexecop-0.2.2a0/src/rexecop/connectors/base.py +35 -0
- rexecop-0.2.2a0/src/rexecop/connectors/capability.py +35 -0
- rexecop-0.2.2a0/src/rexecop/connectors/command_shape.py +30 -0
- rexecop-0.2.2a0/src/rexecop/connectors/composite_runtime.py +118 -0
- rexecop-0.2.2a0/src/rexecop/connectors/errors.py +14 -0
- rexecop-0.2.2a0/src/rexecop/connectors/fixture_loader.py +63 -0
- rexecop-0.2.2a0/src/rexecop/connectors/http_api.py +374 -0
- rexecop-0.2.2a0/src/rexecop/connectors/http_support.py +83 -0
- rexecop-0.2.2a0/src/rexecop/connectors/local_shell.py +126 -0
- rexecop-0.2.2a0/src/rexecop/connectors/mock_runtime.py +60 -0
- rexecop-0.2.2a0/src/rexecop/connectors/mutating.py +13 -0
- rexecop-0.2.2a0/src/rexecop/connectors/runtime.py +16 -0
- rexecop-0.2.2a0/src/rexecop/connectors/ssh_readonly.py +162 -0
- rexecop-0.2.2a0/src/rexecop/environment/__init__.py +4 -0
- rexecop-0.2.2a0/src/rexecop/environment/loader.py +20 -0
- rexecop-0.2.2a0/src/rexecop/environment/model.py +41 -0
- rexecop-0.2.2a0/src/rexecop/environment/sanitize.py +57 -0
- rexecop-0.2.2a0/src/rexecop/errors.py +10 -0
- rexecop-0.2.2a0/src/rexecop/escalation/__init__.py +5 -0
- rexecop-0.2.2a0/src/rexecop/escalation/package.py +31 -0
- rexecop-0.2.2a0/src/rexecop/evidence/__init__.py +4 -0
- rexecop-0.2.2a0/src/rexecop/evidence/event.py +22 -0
- rexecop-0.2.2a0/src/rexecop/evidence/manager.py +47 -0
- rexecop-0.2.2a0/src/rexecop/evidence/redaction.py +26 -0
- rexecop-0.2.2a0/src/rexecop/examples/__init__.py +1 -0
- rexecop-0.2.2a0/src/rexecop/examples/bootstrap_receipt.py +61 -0
- rexecop-0.2.2a0/src/rexecop/execution/__init__.py +6 -0
- rexecop-0.2.2a0/src/rexecop/execution/backend.py +29 -0
- rexecop-0.2.2a0/src/rexecop/execution/executor.py +114 -0
- rexecop-0.2.2a0/src/rexecop/execution/internal_registry.py +59 -0
- rexecop-0.2.2a0/src/rexecop/operation/__init__.py +12 -0
- rexecop-0.2.2a0/src/rexecop/operation/controller.py +554 -0
- rexecop-0.2.2a0/src/rexecop/operation/model.py +111 -0
- rexecop-0.2.2a0/src/rexecop/operation/plan.py +62 -0
- rexecop-0.2.2a0/src/rexecop/operation/state.py +72 -0
- rexecop-0.2.2a0/src/rexecop/orchestration/__init__.py +5 -0
- rexecop-0.2.2a0/src/rexecop/orchestration/orchestrator.py +589 -0
- rexecop-0.2.2a0/src/rexecop/profile/__init__.py +11 -0
- rexecop-0.2.2a0/src/rexecop/profile/contract.py +42 -0
- rexecop-0.2.2a0/src/rexecop/profile/loader.py +76 -0
- rexecop-0.2.2a0/src/rexecop/profile/resolver.py +69 -0
- rexecop-0.2.2a0/src/rexecop/profile/validation_rules.py +28 -0
- rexecop-0.2.2a0/src/rexecop/runtime_ops/__init__.py +19 -0
- rexecop-0.2.2a0/src/rexecop/runtime_ops/coordinator.py +108 -0
- rexecop-0.2.2a0/src/rexecop/runtime_ops/maintenance.py +38 -0
- rexecop-0.2.2a0/src/rexecop/runtime_ops/monitor.py +49 -0
- rexecop-0.2.2a0/src/rexecop/runtime_ops/queue.py +76 -0
- rexecop-0.2.2a0/src/rexecop/runtime_ops/rollback.py +71 -0
- rexecop-0.2.2a0/src/rexecop/runtime_ops/target_lock.py +98 -0
- rexecop-0.2.2a0/src/rexecop/runtime_ops/worker.py +141 -0
- rexecop-0.2.2a0/src/rexecop/secrets/__init__.py +17 -0
- rexecop-0.2.2a0/src/rexecop/secrets/port.py +7 -0
- rexecop-0.2.2a0/src/rexecop/secrets/resolver.py +66 -0
- rexecop-0.2.2a0/src/rexecop/storage/__init__.py +13 -0
- rexecop-0.2.2a0/src/rexecop/storage/factory.py +27 -0
- rexecop-0.2.2a0/src/rexecop/storage/file_store.py +106 -0
- rexecop-0.2.2a0/src/rexecop/storage/memory_store.py +75 -0
- rexecop-0.2.2a0/src/rexecop/storage/port.py +43 -0
- rexecop-0.2.2a0/src/rexecop/storage/sqlite_store.py +158 -0
- rexecop-0.2.2a0/src/rexecop/types.py +10 -0
- rexecop-0.2.2a0/src/rexecop/validation/__init__.py +5 -0
- rexecop-0.2.2a0/src/rexecop/validation/validator.py +130 -0
- rexecop-0.2.2a0/src/rexecop/workflow/__init__.py +4 -0
- rexecop-0.2.2a0/src/rexecop/workflow/loader.py +26 -0
- rexecop-0.2.2a0/src/rexecop/workflow/model.py +93 -0
- rexecop-0.2.2a0/src/rexecop/workflow/runner.py +165 -0
- rexecop-0.2.2a0/tests/conftest.py +28 -0
- rexecop-0.2.2a0/tests/delivery_scope.py +72 -0
- rexecop-0.2.2a0/tests/helpers/__init__.py +0 -0
- rexecop-0.2.2a0/tests/helpers/health_staging_http_server.py +50 -0
- rexecop-0.2.2a0/tests/helpers/staging_http_server.py +141 -0
- rexecop-0.2.2a0/tests/test_alpha_gate.py +59 -0
- rexecop-0.2.2a0/tests/test_alpha_signoff_gate.py +43 -0
- rexecop-0.2.2a0/tests/test_apply_gating.py +81 -0
- rexecop-0.2.2a0/tests/test_apply_gating_govengine_client.py +71 -0
- rexecop-0.2.2a0/tests/test_apply_vertical_slice_e2e.py +109 -0
- rexecop-0.2.2a0/tests/test_cli_plan_smoke.py +48 -0
- rexecop-0.2.2a0/tests/test_cli_smoke.py +18 -0
- rexecop-0.2.2a0/tests/test_composite_runtime_routing.py +140 -0
- rexecop-0.2.2a0/tests/test_connector_backend_plugins.py +81 -0
- rexecop-0.2.2a0/tests/test_delivery_coverage.py +69 -0
- rexecop-0.2.2a0/tests/test_evidence_manager.py +25 -0
- rexecop-0.2.2a0/tests/test_execution_receipt_honesty.py +141 -0
- rexecop-0.2.2a0/tests/test_fixture_bundle_isolation.py +104 -0
- rexecop-0.2.2a0/tests/test_govengine_adapter.py +32 -0
- rexecop-0.2.2a0/tests/test_govengine_client.py +101 -0
- rexecop-0.2.2a0/tests/test_http_api_connector.py +116 -0
- rexecop-0.2.2a0/tests/test_http_health_check_e2e.py +79 -0
- rexecop-0.2.2a0/tests/test_internal_action_registry.py +21 -0
- rexecop-0.2.2a0/tests/test_maintenance_window.py +21 -0
- rexecop-0.2.2a0/tests/test_memory_store.py +48 -0
- rexecop-0.2.2a0/tests/test_mock_connector_runtime.py +122 -0
- rexecop-0.2.2a0/tests/test_operation_controller.py +81 -0
- rexecop-0.2.2a0/tests/test_operation_plan.py +37 -0
- rexecop-0.2.2a0/tests/test_package_import.py +21 -0
- rexecop-0.2.2a0/tests/test_pause_resume.py +75 -0
- rexecop-0.2.2a0/tests/test_phase14_connectors.py +199 -0
- rexecop-0.2.2a0/tests/test_profile_contract.py +26 -0
- rexecop-0.2.2a0/tests/test_public_truth_consistency.py +75 -0
- rexecop-0.2.2a0/tests/test_queue.py +65 -0
- rexecop-0.2.2a0/tests/test_readonly_vertical_slice_e2e.py +39 -0
- rexecop-0.2.2a0/tests/test_receipt_export.py +67 -0
- rexecop-0.2.2a0/tests/test_retry_policy.py +97 -0
- rexecop-0.2.2a0/tests/test_rollback_contract.py +69 -0
- rexecop-0.2.2a0/tests/test_sclite_emitter.py +126 -0
- rexecop-0.2.2a0/tests/test_sclite_full_bundle.py +151 -0
- rexecop-0.2.2a0/tests/test_sclite_placeholder_emitter.py +65 -0
- rexecop-0.2.2a0/tests/test_secret_resolver.py +58 -0
- rexecop-0.2.2a0/tests/test_sqlite_store.py +77 -0
- rexecop-0.2.2a0/tests/test_staging_connectors_e2e.py +136 -0
- rexecop-0.2.2a0/tests/test_state_machine.py +30 -0
- rexecop-0.2.2a0/tests/test_storage_backends.py +88 -0
- rexecop-0.2.2a0/tests/test_target_lock.py +60 -0
- rexecop-0.2.2a0/tests/test_tecrax_profile_integration.py +70 -0
- rexecop-0.2.2a0/tests/test_validator.py +24 -0
- rexecop-0.2.2a0/tests/test_worker_runtime.py +90 -0
- rexecop-0.2.2a0/tests/test_workflow_loader.py +17 -0
- 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 @@
|
|
|
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
|
rexecop-0.2.2a0/LICENSE
ADDED
|
@@ -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)
|