Operations
This page is the operator entry point for runtime procedures in
jhf-openclaw-env. It intentionally stays concise and points to the canonical
runbooks and contracts.
Core Runtime Verify Paths
Fast repository checks
python infrastructure/validate_environment_contracts.pypython infrastructure/validate_module_features_registry.pypython infrastructure/validate_openclaw_runtime_config.pypython infrastructure/validate_execution_track.pypython scripts/verify_portainer_compose_bindings.py --checkbash scripts/scan_and_fix.sh --dry-run --max-issues 1
<internal-runtime-redacted> Portainer access
- Portainer's compose-managed HTTPS control port is loopback-only on <internal-runtime-redacted>.
- Verify the repository posture with
python scripts/verify_portainer_compose_bindings.py --check. - Open the management UI through the SSH tunnel:
ssh -L 9443:<internal-runtime-redacted>:9443 <lane-konto>@<internal-runtime-redacted>. PORTAINER_OC_TOKENremains unchanged; the tunnel changes reachability only.
Host runtime checks
bash scripts/host_preflight_openclaw_env.shbash scripts/host_post_change_verify.shbash scripts/host_post_reboot_verify.shbash scripts/host_post_dockerd_reconcile_verify.sh
Guardrail/recovery checks
bash scripts/host_openclaw_runtime_guardrail.shbash scripts/host_reconcile_core_after_dockerd.shbash scripts/host_reconcile_jhf_tools_restart_safety.shbash scripts/host_tune_low_load_memory_limits.sh [--apply]bash scripts/host_verify_shared_host_disk_budget.shbash scripts/host_reclaim_shared_host_disk_pressure.sh [--apply] [--host HOST] [--user USER]bash scripts/host_reclaim_shared_host_disk_pressure.sh --apply --builder-cache-onlyonly when the documented owner decision permits BuildKit-cache cleanup and the read-only preflight shows it is the sole breached reclaim class (--applyomitted is strictly observational and fails closed if the cleanup guard detects stale diagnostics).bash scripts/host_reclaim_shared_host_swap_pressure.sh [--apply] [--host HOST] [--user USER]bash scripts/verify_post_dockerd_core_reconcile_30m.shbash scripts/host_reconcile_gitea_org_runners.shbash scripts/host_reconcile_heddle_checkout_main.sh --allow-dirty-resetbash scripts/host_verify_heddle_checkout_validator_bundle.shbash scripts/host_reconcile_warp_checkout_main.sh --allow-dirty-resetbash scripts/host_verify_warp_production_roster.shbash scripts/host_reconcile_pattern_checkout_main.sh --allow-dirty-resetreconciles the dedicated<internal-home-redacted>owner checkout backup-first to exact Giteamain; read-only mode fails closed on ignored checkout state, while the explicit allow flag archives tracked, untracked, and ignored state before bounded cleanup. It does not deploy or mutate a runtime.
Windows client checks
powershell -NoProfile -ExecutionPolicy Bypass -File scripts/windows_verify_helpifyr_client_readiness.ps1aggregates Windows DNS, Windows TLS, and Python/OpenSSL trust evidence for the local SSO client lanepowershell -NoProfile -ExecutionPolicy Bypass -File scripts/windows_sync_helpifyr_client_dns.ps1 -PlanOnlypowershell -NoProfile -ExecutionPolicy Bypass -File scripts/windows_verify_helpifyr_client_dns.ps1powershell -NoProfile -ExecutionPolicy Bypass -File scripts/windows_sync_helpifyr_client_dns.ps1powershell -NoProfile -ExecutionPolicy Bypass -File scripts/windows_verify_helpifyr_client_tls.ps1powershell -NoProfile -ExecutionPolicy Bypass -File scripts/windows_sync_helpifyr_client_trust.ps1powershell -NoProfile -ExecutionPolicy Bypass -File scripts/windows_clear_helpifyr_browser_state.ps1powershell -NoProfile -ExecutionPolicy Bypass -File scripts/windows_clear_helpifyr_browser_state.ps1 -Applypython scripts/verify_helpifyr_schannel_revocation_chain.py --json
Auth and Access Runtime Checks
- OSS SSO Status Matrix (
docs/OSS_SSO_STATUS_MATRIX.md) bash scripts/host_verify_erp_identity_lifecycle_boundary.shbash scripts/host_verify_erp_identity_surface_fabric_parity.shbash scripts/host_verify_sso_v4_env_auth_runtime.shbash scripts/host_materialize_gitea_ci_oidc_sso.shbash scripts/host_verify_proxy_auth_topology.shbash scripts/host_verify_local_admin_quarantine.shbash scripts/host_verify_future_module_runtime_auth_onboarding.shbash scripts/host_verify_helpifyr_tls_client_trust.shpowershell -NoProfile -ExecutionPolicy Bypass -File scripts/windows_verify_helpifyr_client_readiness.ps1python scripts/verify_helpifyr_python_tls_client_trust.py --jsonpython scripts/verify_helpifyr_schannel_revocation_chain.py --jsonpython scripts/verify_helpifyr_client_trust_contract.pypython scripts/verify_erp_identity_surface_fabric_parity.pypython scripts/verify_oss_sso_status_matrix.pypython scripts/verify_helpifyr_sso_https_surface_inventory.pypython scripts/verify_helpifyr_sso_https_surface_inventory.py --check-livepython scripts/verify_helpifyr_sso_https_surface_inventory.py --check-live --ssh-target <internal-runtime-redacted><internal-runtime-redacted>python scripts/capture_issue2114_asterisk_grafana_workstation_truth.py --reported-browser-failurefor the bounded workstation-vs-<internal-runtime-redacted> contradiction lane when Asterisk or Grafana browser SSO is reported broken while the repo-owned launcher and host-managed E2E paths may already be green
Runtime Mutation Rule
For runtime-affecting changes, always capture:
- Pre-change snapshot/evidence
- Mutation/apply evidence
- Post-change verify evidence
- Post-push live verify evidence
Canonical evidence ledger:
LIVE_OPERATIONS_LOG.md (docs/LIVE_OPERATIONS_LOG.md)
Credential Reminder
- Canonical local operator credential source:
~/.config/helpifyr/operator.env - Includes:
GITEA_TOKEN- host SSH credentials (
OPENCLAW_HOST,OPENCLAW_HOST_USER,OPENCLAW_HOST_PW) - host sudo password (
OPENCLAW_HOST_SUDO_PW)
- Sanitized verify:
python scripts/operator_env.py --json --keys GITEA_TOKEN,OPENCLAW_HOST,OPENCLAW_HOST_USER,OPENCLAW_HOST_SUDO_PW - Canonical <internal-runtime-redacted> operator-env staging lane for admitted managed keys:
bash scripts/host_stage_operator_env_keys.sh --keys GITEA_TOKEN - Canonical bounded <internal-runtime-redacted> Gitea Helpifyr Identity materializer:
bash scripts/host_materialize_gitea_ci_oidc_sso.sh- hardening policy inputs are env-driven:
GITEA_CI_OIDC_GROUP_CLAIM_NAME,GITEA_CI_OIDC_REQUIRED_CLAIM_NAME,GITEA_CI_OIDC_REQUIRED_CLAIM_VALUE,GITEA_CI_OIDC_ADMIN_GROUP,GITEA_CI_OIDC_RESTRICTED_GROUP,GITEA_CI_OIDC_GROUP_TEAM_MAP,GITEA_CI_OIDC_GROUP_TEAM_MAP_REMOVAL
- hardening policy inputs are env-driven:
- Canonical bounded <internal-runtime-redacted> Gitea owner-runtime policy verifier:
bash scripts/host_verify_gitea_ci_oidc_source_ci_plane.sh- supports explicit expected policy readback for the same claim/team fields
- Canonical bounded Lantern HITL runtime auth materializer:
bash scripts/host_materialize_lantern_runtime_auth_env.sh - Canonical bounded Plan Studio Phase-1 owner-binding materializer (requires
an owner-approved Keystore source and fails closed when it is absent):
bash scripts/host_materialize_plan_studio_owner_bindings.sh - Canonical bounded Shuttle Plan Studio C8 owner-token materializer (requires
the owner-approved
jhf-keystore#289source and recreates only the C8 service):bash scripts/host_materialize_plan_studio_shuttle_owner_token.sh - Canonical bounded Lantern HITL runtime auth verifier:
python scripts/verify_issue1637_lantern_runtime_auth_materialization.py - Canonical bounded Lantern Customer360 MCP admission verifier:
python scripts/verify_issue1693_lantern_customer360_mcp_admission.py - Canonical bounded Weft <internal-runtime-redacted> live-Graph env sync lane:
bash scripts/host_sync_weft_m365_live_graph_env.shThe lane stages a candidate in the target directory, verifies the downstream Weft secret-ref posture against that candidate, and only then snapshots and atomically replaces the target env file. A failed verifier leaves the target file and mode unchanged. - Canonical bounded Weft <internal-runtime-redacted> live-Graph env verifier:
python scripts/verify_issue1282_weft_m365_live_graph_env.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> Nextcloud selfhost OIDC env sync lane:
bash scripts/host_sync_weft_nextcloud_oidc_env.sh - Canonical bounded Weft <internal-runtime-redacted> Nextcloud selfhost OIDC env verifier:
python scripts/verify_issue1313_weft_nextcloud_oidc_env.py --allow-blocked - Canonical bounded <internal-runtime-redacted> Weft checkout dirty-state recovery lane:
bash scripts/host_resolve_issue1317_weft_checkout_dirty.sh - Canonical bounded <internal-runtime-redacted> Weft checkout dirty-state verifier:
python scripts/verify_issue1317_weft_checkout_dirty.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> Nextcloud public OIDC launcher trust sync lane:
bash scripts/host_sync_weft_nextcloud_oidc_trust.sh - Canonical bounded Weft <internal-runtime-redacted> Nextcloud public OIDC launcher trust verifier:
python scripts/verify_issue1318_weft_nextcloud_oidc_launcher_trust.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> Nextcloud OIDC callback-landing narrowing lane:
bash scripts/host_sync_weft_nextcloud_oidc_callback_landing.sh - Canonical bounded Weft <internal-runtime-redacted> Nextcloud OIDC callback-landing verifier:
python scripts/verify_issue1328_weft_nextcloud_oidc_callback_landing.py --allow-blocked - Canonical <internal-runtime-redacted> Weft checkout reconcile lane for bounded selfhost Collabora materialization:
bash scripts/host_reconcile_weft_checkout_main.sh --allow-dirty-reset- admitted cleanup scope inside this lane is limited to Weft-owned
compose/runtime-data*residue after backup capture - unrelated dirty state in the <internal-runtime-redacted> Weft checkout remains fail-closed even with
--allow-dirty-reset
- admitted cleanup scope inside this lane is limited to Weft-owned
- Canonical bounded Weft <internal-runtime-redacted> selfhost Collabora materialization lane:
bash scripts/host_materialize_issue1293_weft_collabora_runtime.sh - Canonical bounded Weft <internal-runtime-redacted> selfhost Collabora verifier:
python scripts/verify_issue1293_weft_collabora_runtime.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> selfhost mail env sync lane:
bash scripts/host_sync_weft_selfhost_mail_env.sh - Canonical bounded Weft <internal-runtime-redacted> selfhost mail materialization lane:
bash scripts/host_materialize_issue1315_weft_selfhost_mail_runtime.sh - Canonical bounded Weft <internal-runtime-redacted> selfhost mail verifier:
python scripts/verify_issue1315_weft_selfhost_mail_runtime.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> selfhost mail backup/restore drill materializer:
bash scripts/host_materialize_issue1358_weft_selfhost_mail_backup_restore.sh - Canonical bounded Weft <internal-runtime-redacted> selfhost mail backup/restore drill verifier:
python scripts/verify_issue1358_weft_selfhost_mail_backup_restore.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> Stalwart backup/freshness materializer:
bash scripts/host_materialize_issue1565_weft_stalwart_backup_freshness.sh - Canonical <internal-runtime-redacted> dangling-Stalwart-bind forensic/reconcile lane:
bash scripts/host_reconcile_issue1864_weft_stalwart_data_bind.sh- default execution is read-only and reports
human_approval_required - a restore requires an explicit verified artifact and
--apply --human-approved-restore; it must never create or overwrite an empty data root
- default execution is read-only and reports
- Canonical bounded Weft <internal-runtime-redacted> Stalwart backup/freshness verifier:
python scripts/verify_issue1565_weft_stalwart_backup_freshness.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> Stalwart restore drill from canonical backup materializer:
bash scripts/host_materialize_issue1572_weft_stalwart_restore_drill.sh - Canonical bounded Weft <internal-runtime-redacted> Stalwart restore drill from canonical backup verifier:
python scripts/verify_issue1572_weft_stalwart_restore_drill.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> Nextcloud Mail TLS alignment materializer:
bash scripts/host_materialize_issue1361_weft_nextcloud_mail_tls_alignment.sh - Canonical bounded Weft <internal-runtime-redacted> Nextcloud Mail TLS alignment verifier:
python scripts/verify_issue1361_weft_nextcloud_mail_tls_alignment.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> Nextcloud Mail authenticated-send materializer:
bash scripts/host_materialize_issue1363_weft_nextcloud_mail_authenticated_send.sh - Canonical bounded Weft <internal-runtime-redacted> Nextcloud Mail authenticated-send verifier:
python scripts/verify_issue1363_weft_nextcloud_mail_authenticated_send.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> Nextcloud Calendar/Contacts materialization lane:
bash scripts/host_materialize_issue1338_weft_calendar_contacts_runtime.sh - Canonical bounded Weft <internal-runtime-redacted> Nextcloud Calendar/Contacts verifier:
python scripts/verify_issue1338_weft_calendar_contacts_runtime.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> Nextcloud public ingress restore lane:
bash scripts/host_materialize_issue1495_weft_nextcloud_public_ingress.sh - Canonical bounded Weft <internal-runtime-redacted> Nextcloud public ingress restore verifier:
python scripts/verify_issue1495_weft_nextcloud_public_ingress.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> runtime-state bind reconcile lane:
bash scripts/host_materialize_issue1581_weft_runtime_state_bind.sh - Canonical bounded Weft <internal-runtime-redacted> runtime-state bind reconcile verifier:
python scripts/verify_issue1581_weft_runtime_state_bind.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> Nextcloud Mail TLS/diagnose restore lane:
bash scripts/host_materialize_issue1499_weft_nextcloud_mail_tls_diagnose_restore.sh - Canonical bounded Weft <internal-runtime-redacted> Nextcloud Mail TLS/diagnose restore verifier:
python scripts/verify_issue1499_weft_nextcloud_mail_tls_diagnose_restore.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> Nextcloud Mail auth-posture restore lane:
bash scripts/host_materialize_issue1500_weft_nextcloud_mail_auth_posture.sh - Canonical bounded Weft <internal-runtime-redacted> Nextcloud Mail auth-posture restore verifier:
python scripts/verify_issue1500_weft_nextcloud_mail_auth_posture.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> Stalwart live-auth reload lane:
bash scripts/host_materialize_issue1514_weft_stalwart_live_auth_reload.sh - Canonical bounded Weft <internal-runtime-redacted> Stalwart live-auth reload verifier:
python scripts/verify_issue1514_weft_stalwart_live_auth_reload.py --allow-blocked - Canonical read-only <internal-runtime-redacted> Stalwart OIDC-directory runtime verifier:
python scripts/verify_issue2145_stalwart_oidc_directory_runtime.py --allow-blocked - Canonical bounded <internal-runtime-redacted> Stalwart OIDC-directory materializer (preview by default; use
--applyonly after review and merge):bash scripts/host_materialize_issue2145_stalwart_oidc_directory_runtime.sh [--apply]The apply path settles the post-recreate management readback before evaluating Heddle postconditions and only reports a rollback as completed after a final active-directory readback confirms the restored state. - Canonical read-only <internal-runtime-redacted> Stalwart legacy management/OIDC-consumer contract verifier:
python scripts/verify_issue2145_stalwart_legacy_management_contract.py --allow-blocked - Canonical bounded <internal-runtime-redacted> Stalwart HYBRID directory + admin-UI SSO materializer
(
jhf-openclaw-env#3233; preview by default;--applyis a lane-separated post-merge Claude-Lane action perhelpifyr-fabric#2887 §2, never run from the authoring branch/PR session):bash scripts/host_materialize_issue3233_stalwart_hybrid_directory_sso.sh [--check|--apply|--rollback]--checkswitches storage.directory fromheddle-stalwart-admintointernalonly in preview: JML-provisioned principals live in the internal (rocksdb) directory, while the existingheddle-stalwart-adminOIDC directory is kept and extended with thestalwart-webuiclient-id/secret and aclass-map.mailserver_admin -> adminrole gate so it authenticates only human admin-UI logins admitted by the Heddle Fabric-admission provider (seeJaddaHelpifyr/jhf-heddledocs/STALWART_FABRIC_ADMISSION_PROVIDER.mdfor thestalwart_management_admitted/management_scopeclaim contract).--applybacks upconfig.tomlfirst, verifies the fallback-admin path and the container-internal OIDC discovery endpoint stay reachable, and auto-rolls back on any postcondition failure.--rollbackrestores the most recent backup. The client secret is read from the Heddle-owned<internal-home-redacted>(STALWART_WEBUI_OIDC_CLIENT_SECRET, 0600) and is never printed; readback only reports presence/absence booleans. The host-side management API base URL isOPENCLAW_STALWART_MGMT_URL(defaulthttp://<internal-runtime-redacted>:18082); after the WEFT-M01 bind change (jhf-weft#721) the admin/JMAP publish lives on the docker bridge gateway, so passOPENCLAW_STALWART_MGMT_URL=http://<bridge-gateway>:18082(docker network inspect bridge -f '{{(index .IPAM.Config 0).Gateway}}'). The container-internal OIDC discovery probe useswgetwhen present and falls back to a bash/dev/tcpGET because the Stalwart image ships no HTTP client. - Canonical <internal-runtime-redacted> Heddle Keycloak Stalwart signed-admission provider lane
(
jhf-openclaw-env#3252, programhelpifyr-fabric#3537, refsjhf-heddle#776/#777,jhf-openclaw-env#3242; the--apply/--rollbacksteps are a lane-separated post-merge Claude-Lane action inside an Owner-confirmed window, never run from the authoring session):OPENCLAW_HOST=<host-alias> bash scripts/host_materialize_issue3252_heddle_stalwart_signed_admission_provider.sh --check... --apply --confirm-window <id>/... --rollback --confirm-window <id>The lane repointsSTALWART_FABRIC_DECISION_URLto.../stalwart-management/admission, addsSTALWART_FABRIC_JWKS_URL,STALWART_FABRIC_ADMISSION_ISSUERandSTALWART_FABRIC_ADMISSION_AUDIENCE(issuer/audience/read token fromjhf-fabric-auth.env, fail closed when empty) and carries tenant/company/environment over from the durable.../runtime-secrets/jhf-heddle-stalwart-provider.env(fail closed when absent, never invented). Every compose call uses the same--project-nameand--env-file(the values were lost live when the container was recreated without the env file).--checkis read-only drift verification (container env vs durable file vs compose render vs Fabric overlay; names, non-secret values and sha256 fingerprints only) plus/jwks200and the container token on/admissionand/decision(200/422, not401).--applysnapshots (redacted inspect, env copy, rollback image tag), rewrites the durable file, rebuildsjhf-heddle-keycloak:stalwart-management-providerfrom cleanjhf-heddlemain, recreates onlykeycloak, re-runs the check and rolls back automatically on failure. Receipts:runtime/evidence/issue3252-heddle-stalwart-signed-admission.<stamp>/receipt-<mode>.json. Compose success is decided by exit code only (thevariable is not setwarning storm for other services is ignored and never reaches a receipt); before recreating, the compose render of thekeycloakservice must equal the running container in every key except the intendedSTALWART_FABRIC_*ones (fail closed). The Fabric probe runs in the container and falls back to host-side curl (ISSUE3252_HOST_PROBE_BASEmaps the docker-internal Fabric base to a host-reachable one; token via private header file, never argv). The Heddle checkout gate ignores untracked files (status --porcelain --untracked-files=no) and runs git with-c safe.directory=<checkout>. The script never usescd(the operator cannot traverse<internal-home-redacted>): compose runs assudo -n docker compose --project-name ... --env-file <abs> --project-directory <abs> -f <abs>, git as the checkout owner with-c safe.directory.--applyprobes Fabric host-side (overlay token, status codes only) before touching anything, records a pre-apply baseline (unrelated pre-existing drift never triggers the automatic rollback), proves the rebuilt image shipsFabricAdmissionVerifier/FabricJwksSource/FabricDecisionReaderin the provider jar (jar sha256 in the receipt) before the recreate, writes the env file atomically, holds a lock dir, and ends withfailed_rollback_failed(exit 1) when the automatic rollback itself fails. The on-host body re-validates mode and--confirm-window. Compose interpolates the whole project (every service), and the running container was created with the project default env, so every compose call passes BOTH env files:--env-file <checkout>/.env --env-file <durable provider env>(later wins, so the durableSTALWART_FABRIC_*override). The.envpath isHEDDLE_PROJECT_ENV(default<checkout>/.env); it must exist (elseblocked_missing_heddle_project_env), is only read, and no value from it is ever printed or receipted. The render guard compares the renderedkeycloakenvironment from both files with the running container: every key except the intendedSTALWART_FABRIC_*must be equal, otherwiseblocked_keycloak_render_differs_from_running_container. The compose labelcom.docker.compose.project.environment_fileis empty when the project default env was used; compose records repeated--env-filearguments comma-joined there (assumed, to be confirmed live), so after the apply the label may be empty,<checkout>/.env,<durable>or either single file, anything else is reported asenv_file_label_problem. The older2135materializer is superseded for these inputs. - Canonical read-only <internal-runtime-redacted> Stalwart hybrid-directory/SSO verifier (also
reports the raw port 18082 socket binding for the WEFT-M01 follow-up):
python scripts/verify_issue3233_stalwart_hybrid_directory_sso.py --host <alias> --allow-blocked--management-url(default from envOPENCLAW_STALWART_MGMT_URL, elsehttp://<internal-runtime-redacted>:18082) sets the remote-side Stalwart management API base URL used for every settings call, mirroring the materializer's ownOPENCLAW_STALWART_MGMT_URL; after the WEFT-M01 bind change (jhf-weft#721) pass the bridge-gateway URL there too. The port 18082 binding is classified asloopback_only(<internal-runtime-redacted>/::1only),host_only_bridge_gateway(every listener on the single non-loopback address that equals the docker bridge gateway, read remotely viadocker network inspect bridge -f '{{(index .IPAM.Config 0).Gateway}}') — the admitted post-WEFT-M01 posture, treated the same asloopback_only— or0.0.0.0_public(anything else), which always stays a blocking finding. - Canonical read-only Stalwart admin ingress verifier (route, DNS, TLS, and
direct-port posture;
--pre-closurerequires explicit proxy/SSO evidence):bash scripts/host_verify_stalwart_management_ingress.sh [--pre-closure] - Canonical controlled direct-port closure lane (preview by default; never run
--applyuntil proxy/SSO readback is green and a human ticket is recorded):bash scripts/host_apply_issue1865_stalwart_direct_port_closure.sh [--apply|--rollback] - Canonical bounded Weft <internal-runtime-redacted> Nextcloud Mail restart-readiness lane:
bash scripts/host_materialize_issue1517_weft_nextcloud_mail_restart_readiness.sh - Canonical bounded Weft <internal-runtime-redacted> Nextcloud Mail restart-readiness verifier:
python scripts/verify_issue1517_weft_nextcloud_mail_restart_readiness.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> functional mailbox inventory/owner readback lane:
bash scripts/host_materialize_issue1566_weft_functional_mailbox_owner_readback.sh - Canonical bounded Weft <internal-runtime-redacted> functional mailbox inventory/owner readback verifier:
python scripts/verify_issue1566_weft_functional_mailbox_owner_readback.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> shared-mailbox ownership/work-claim readback lane:
bash scripts/host_materialize_issue1577_weft_shared_mailbox_work_claim_readback.sh - Canonical bounded Weft <internal-runtime-redacted> shared-mailbox ownership/work-claim readback verifier:
python scripts/verify_issue1577_weft_shared_mailbox_work_claim_readback.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> deferred functional/shared mailbox delegation verifier:
python scripts/verify_issue1340_weft_mailbox_delegation_deferred.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> explicit functional/shared mailbox principal-gap verifier:
python scripts/verify_issue1346_weft_functional_mailbox_principal_gap.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> functional mailbox principal materializer:
bash scripts/host_materialize_issue1349_weft_functional_mailbox_principal.sh - Canonical bounded Weft <internal-runtime-redacted> functional mailbox principal materialized verifier:
python scripts/verify_issue1349_weft_functional_mailbox_principal_materialized.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> delegated mailbox usage narrowing verifier:
python scripts/verify_issue1351_weft_delegated_mailbox_usage_narrowed.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> direct functional mailbox JMAP auth materializer:
bash scripts/host_materialize_issue1354_weft_functional_mailbox_auth_surface.sh - Canonical bounded Weft <internal-runtime-redacted> direct functional mailbox JMAP auth verifier:
python scripts/verify_issue1354_weft_functional_mailbox_auth_surface.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> shared-mailbox ownership materializer:
bash scripts/host_materialize_issue1365_weft_shared_mailbox_ownership.sh - Canonical bounded Weft <internal-runtime-redacted> shared-mailbox ownership verifier:
python scripts/verify_issue1365_weft_shared_mailbox_ownership.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> alternative mailbox-group relation materializer:
bash scripts/host_materialize_issue1370_weft_mailbox_group_alt_path.sh - Canonical bounded Weft <internal-runtime-redacted> alternative mailbox-group relation verifier:
python scripts/verify_issue1370_weft_mailbox_group_alt_path.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> Stalwart capability-gap materializer:
bash scripts/host_materialize_issue1373_weft_stalwart_capability_gap.sh - Canonical bounded Weft <internal-runtime-redacted> Stalwart capability-gap verifier:
python scripts/verify_issue1373_weft_stalwart_capability_gap.py --allow-blocked- exact-main relation/JMAP chain source:
scripts/fixtures/issue1370.weft_mailbox_group_alt_path.readback.json - Canonical bounded Weft <internal-runtime-redacted> Stalwart candidate-compatibility materializer:
bash scripts/host_materialize_issue1378_weft_stalwart_compatibility.sh - Canonical bounded Weft <internal-runtime-redacted> Stalwart candidate-compatibility verifier:
python scripts/verify_issue1378_weft_stalwart_compatibility.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> Stalwart version-lift rehearsal materializer:
bash scripts/host_materialize_issue1380_weft_stalwart_rehearsal.sh - Canonical bounded Weft <internal-runtime-redacted> Stalwart version-lift rehearsal verifier:
python scripts/verify_issue1380_weft_stalwart_rehearsal.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> Stalwart copied-config compatibility materializer:
bash scripts/host_materialize_issue1382_weft_stalwart_config_gap.sh - Canonical bounded Weft <internal-runtime-redacted> Stalwart copied-config compatibility verifier:
python scripts/verify_issue1382_weft_stalwart_config_gap.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> Stalwart config regeneration materializer:
bash scripts/host_materialize_issue1384_weft_stalwart_config_regeneration.sh - Canonical bounded Weft <internal-runtime-redacted> Stalwart config regeneration verifier:
python scripts/verify_issue1384_weft_stalwart_config_regeneration.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> Stalwart copied-runtime ownership translation materializer:
bash scripts/host_materialize_issue1386_weft_stalwart_ownership_translation.sh - Canonical bounded Weft <internal-runtime-redacted> Stalwart copied-runtime ownership translation verifier:
python scripts/verify_issue1386_weft_stalwart_ownership_translation.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> Stalwart post-translation v0.15 bridge materializer:
bash scripts/host_materialize_issue1388_weft_stalwart_v015_bridge.sh - Canonical bounded Weft <internal-runtime-redacted> Stalwart post-translation v0.15 bridge verifier:
python scripts/verify_issue1388_weft_stalwart_v015_bridge.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> Stalwart
v0.15.5bridge rehearsal materializer:bash scripts/host_materialize_issue1390_weft_stalwart_v015_rehearsal.sh - Canonical bounded Weft <internal-runtime-redacted> Stalwart
v0.15.5bridge rehearsal verifier:python scripts/verify_issue1390_weft_stalwart_v015_rehearsal.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> Stalwart
v0.16dump/convert helper materializer:bash scripts/host_materialize_issue1392_weft_stalwart_v016_dump_convert.sh - Canonical bounded Weft <internal-runtime-redacted> Stalwart
v0.16dump/convert helper verifier:python scripts/verify_issue1392_weft_stalwart_v016_dump_convert.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> Stalwart
v0.16tomllib-prerequisite materializer:bash scripts/host_materialize_issue1394_weft_stalwart_v016_tomllib_prereq.sh - Canonical bounded Weft <internal-runtime-redacted> Stalwart
v0.16tomllib-prerequisite verifier:python scripts/verify_issue1394_weft_stalwart_v016_tomllib_prereq.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> Stalwart helper-auth classification materializer:
bash scripts/host_materialize_issue1396_weft_stalwart_helper_auth_gap.sh - Canonical bounded Weft <internal-runtime-redacted> Stalwart helper-auth classification verifier:
python scripts/verify_issue1396_weft_stalwart_helper_auth_gap.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> Stalwart management-credential-source materializer:
bash scripts/host_materialize_issue1397_weft_stalwart_management_credential_source.sh - Canonical bounded Weft <internal-runtime-redacted> Stalwart management-credential-source verifier:
python scripts/verify_issue1397_weft_stalwart_management_credential_source.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> Stalwart canonical host-secret-contract materializer:
bash scripts/host_materialize_issue1399_weft_stalwart_management_secret_contract.sh - Canonical bounded Weft <internal-runtime-redacted> Stalwart canonical host-secret-contract verifier:
python scripts/verify_issue1399_weft_stalwart_management_secret_contract.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> Stalwart runtime-secret env contract-admission materializer:
bash scripts/host_materialize_issue1402_weft_stalwart_management_secret_env_contract.sh - Canonical bounded Weft <internal-runtime-redacted> Stalwart runtime-secret env contract-admission verifier:
python scripts/verify_issue1402_weft_stalwart_management_secret_env_contract.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> Stalwart runtime-secret env unstaged-gap materializer:
bash scripts/host_materialize_issue1404_weft_stalwart_management_secret_env_staging_gap.sh - Canonical bounded Weft <internal-runtime-redacted> Stalwart runtime-secret env unstaged-gap verifier:
python scripts/verify_issue1404_weft_stalwart_management_secret_env_staging_gap.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> Stalwart secure-input-source gap materializer:
bash scripts/host_materialize_issue1406_weft_stalwart_secure_input_source_gap.sh - Canonical bounded Weft <internal-runtime-redacted> Stalwart secure-input-source gap verifier:
python scripts/verify_issue1406_weft_stalwart_secure_input_source_gap.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> Stalwart secure-input-source contract-gap materializer:
bash scripts/host_materialize_issue1408_weft_stalwart_secure_input_source_contract_gap.sh - Canonical bounded Weft <internal-runtime-redacted> Stalwart secure-input-source contract-gap verifier:
python scripts/verify_issue1408_weft_stalwart_secure_input_source_contract_gap.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> Stalwart secure-input-source materialization-gap materializer:
bash scripts/host_materialize_issue1410_weft_stalwart_secure_input_source_materialization_gap.sh
- exact-main relation/JMAP chain source:
- Canonical bounded Weft <internal-runtime-redacted> Stalwart secure-input-source materialization-gap verifier:
python scripts/verify_issue1410_weft_stalwart_secure_input_source_materialization_gap.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> Stalwart secure-input sync/stage-gap materializer:
bash scripts/host_materialize_issue1412_weft_stalwart_secure_input_source_sync_stage_gap.sh - Canonical bounded Weft <internal-runtime-redacted> Stalwart secure-input sync/stage-gap verifier:
python scripts/verify_issue1412_weft_stalwart_secure_input_source_sync_stage_gap.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> Stalwart operator-env managed-key-gap materializer:
bash scripts/host_materialize_issue1414_weft_stalwart_operator_env_managed_key_gap.sh - Canonical bounded Weft <internal-runtime-redacted> Stalwart operator-env managed-key-gap verifier:
python scripts/verify_issue1414_weft_stalwart_operator_env_managed_key_gap.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> Stalwart dedicated runtime-secret stage-wrapper-gap materializer:
bash scripts/host_materialize_issue1416_weft_stalwart_stage_wrapper_gap.sh - Canonical bounded Weft <internal-runtime-redacted> Stalwart dedicated runtime-secret stage-wrapper-gap verifier:
python scripts/verify_issue1416_weft_stalwart_stage_wrapper_gap.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> Stalwart managed-key-family-admission materializer:
bash scripts/host_materialize_issue1418_weft_stalwart_managed_key_family_admission.sh - Canonical bounded Weft <internal-runtime-redacted> Stalwart managed-key-family-admission verifier:
python scripts/verify_issue1418_weft_stalwart_managed_key_family_admission.py --allow-blocked - Canonical Weft Stalwart runtime-secret stage wrapper:
bash scripts/host_stage_weft_stalwart_management_env.sh - Canonical bounded Weft <internal-runtime-redacted> Stalwart dedicated stage-wrapper materializer:
bash scripts/host_materialize_issue1420_weft_stalwart_stage_wrapper_materialization.sh - Canonical bounded Weft <internal-runtime-redacted> Stalwart dedicated stage-wrapper verifier:
python scripts/verify_issue1420_weft_stalwart_stage_wrapper_materialization.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> Stalwart stage-replay source-gap materializer:
bash scripts/host_materialize_issue1423_weft_stalwart_stage_source_gap.sh - Canonical bounded Weft <internal-runtime-redacted> Stalwart stage-replay source-gap verifier:
python scripts/verify_issue1423_weft_stalwart_stage_source_gap.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> Stalwart successful stage-replay materializer:
bash scripts/host_materialize_issue1461_weft_stalwart_stage_replay.sh - Canonical bounded Weft <internal-runtime-redacted> Stalwart successful stage-replay verifier:
python scripts/verify_issue1461_weft_stalwart_stage_replay.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> Stalwart post-secret helper-auth reprobe materializer:
bash scripts/host_materialize_issue1471_weft_stalwart_helper_auth_reprobe.sh - Canonical bounded Weft <internal-runtime-redacted> Stalwart post-secret helper-auth reprobe verifier:
python scripts/verify_issue1471_weft_stalwart_helper_auth_reprobe.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> Stalwart fallback-admin hash alignment materializer:
bash scripts/host_materialize_issue1479_weft_stalwart_fallback_admin_hash_alignment.sh - Canonical bounded Weft <internal-runtime-redacted> Stalwart fallback-admin hash alignment verifier:
python scripts/verify_issue1479_weft_stalwart_fallback_admin_hash_alignment.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> Stalwart runtime-drift reconcile materializer:
bash scripts/host_materialize_issue1483_weft_stalwart_runtime_drift.sh - Canonical bounded Weft <internal-runtime-redacted> Stalwart runtime-drift reconcile verifier:
python scripts/verify_issue1483_weft_stalwart_runtime_drift.py --allow-blocked - Canonical bounded Weft <internal-runtime-redacted> Stalwart
v0.15.5production bridge-cutover materializer:bash scripts/host_materialize_issue1487_weft_stalwart_v015_cutover.sh - Canonical bounded Weft <internal-runtime-redacted> Stalwart
v0.15.5production bridge-cutover verifier:python scripts/verify_issue1487_weft_stalwart_v015_cutover.py --allow-blocked - Canonical Weft <internal-runtime-redacted> Stalwart
v0.15.5->v0.16.xcutover lane (jhf-openclaw-env#3243, programhelpifyr-fabric#3537), modes--check(read-only plan),--backup,--rehearse(on a copy, incl. rollback test),--apply,--rollback:bash scripts/host_materialize_issue3243_weft_stalwart_v016_cutover.sh --check - Canonical Weft <internal-runtime-redacted> Stalwart
v0.16.xcutover verifier (receipt classification, live gates, cutover-time inventory patch and change list):python scripts/verify_issue3243_weft_stalwart_v016_cutover.py --run-check --allow-blocked--backup,--applyand--rollbackrequire--confirm-window <id>(the Owner-confirmed downtime window); nothing in this lane runs on merge- status: the live cutover to
stalwartlabs/stalwart:v0.16.23(digestsha256:be215678796691bc39bdda918ecc50d14a9032a099a1d1950e51950aec7e2592) was completed on 2026-09-26 (apply backup20260925T231851Z-apply, pre-window backup20260925T223628Z);0.15.5is now only the recorded source/rollback image. Host env after the cutover:WEFT_STALWART_IMAGE=stalwartlabs/stalwart:v0.16.23,WEFT_STALWART_DATA_DIR=/var/lib/stalwart, config root<data-root>/etc016at/etc/stalwart(written byscripts/host_sync_weft_selfhost_mail_env.sh) - warning: after a
--rollbackre-pin the hoststalwart.envtoWEFT_STALWART_IMAGE=stalwartlabs/stalwart:v0.15.5andWEFT_STALWART_DATA_DIR=/opt/stalwartby hand (the lane rollback only uses a private env copy). A plaincompose up, the env sync plus recreate, or the1315materializer recreates the container from the tag-only image and drops the lane override (OIDCextra_hosts,SSL_CERT_FILEbundle,commandreset, exact tag@digest): do not run them against the cut-over host until jhf-weft compose OIDC/CA support exists - runbook note (
#3246): phase B runs with live queues (normal mode, recovery admin still set) and without--dns <internal-runtime-redacted>on the apply path, so outbound delivery and ACME can start against the live data root; keep the window closed to mail traffic until the final container is up. Phase A/B containers are stopped withdocker stop -t 30before removal,recovery.envis0600, and certificate-tool output never reaches a receipt - the Heddle timer
jhf-heddle-stalwart-mailbox-projection.timeris stopped for the window and kept stopped after apply (the deployed projector may still be the 0.15 REST version until jhf-heddle#769); the receipt carriestimer_stateandtimer_start_command,WEFT_STALWART_RESTART_TIMER=1opts into a restart after the projector probe
- Canonical bounded Weft <internal-runtime-redacted> post-
v0.15.5helper/hash config-path re-anchor owner issue:JaddaHelpifyr/jhf-openclaw-env#1488- active runtime config truth after the cutover is the live
/opt/stalwart/etc/config.tomlpath family when present - legacy
/opt/stalwart-mailremains compatibility-only and must not stay the default assumption in helper/hash readback lanes
- active runtime config truth after the cutover is the live
- Canonical bounded Weft <internal-runtime-redacted> selfhost mail deliverability verifier:
python scripts/verify_issue1331_weft_selfhost_mail_deliverability.py --allow-blocked - The bounded Weft live-Graph owner posture now includes both:
- Graph URL/ref keys
- non-demo M365 identifiers (
WEFT_M365_TENANT_ID,WEFT_M365_SITE_ID,WEFT_M365_DRIVE_ID)
- Default posture:
stages only requested managed keys into
<internal-home-redacted>on <internal-runtime-redacted>, preserves unrelated remote entries, never prints secret values, and fails closed when a requested key is missing locally. .is legacy fallback only and must not be treated as the canonical accumulation path.
OpenClaw Model Runtime Note
- Canonical default model policy is
deepseek/deepseek-v4-flashfor all standard OpenClaw agents and runtime-generated heartbeat/subagent lanes. - Explicit model exceptions are limited to:
jadda-voice-warm -> anthropic/claude-haiku-4-5
- Repository verifier:
python scripts/verify_openclaw_agent_model_policy.py - Live reconcile:
bash scripts/host_reconcile_openclaw_agent_model_policy.sh - Live verify:
python scripts/verify_openclaw_agent_model_policy.py --live-via-ssh <internal-runtime-redacted><internal-runtime-redacted> - Required success signal:
a bounded real
mainturn must start successfully; config or roster readback alone is not enough.
Repo-Local Scan&Fix Automation
- canonical execution standard prompt:
prompts/scan_and_fix_execution_standard.md - canonical dispatcher:
scripts/scan_and_fix.sh - default posture:
- Gitea open issues are the Source of Truth
- serial dispatch is worktree-safe and repo-scoped
- real execution uses
--executor-cmdor localopenclawCLI when present --dry-runis required for safe prompt inspection without execution
Repo-Local Scan&Pull Automation
- canonical merge dispatcher:
scripts/scan_and_pull.sh - canonical implementation:
scripts/scan_and_pull.py - default posture:
- Gitea open pull requests are the Source of Truth
- use
--mode scanwithGITEA_TOKENfor a read-only queue; use--mode review --owner <owner> --repo <repo> --number <number>withGITEA_MERGE_TOKENto submit and read back an exact-head GiteaAPPROVED; use--mode mergewithGITEA_MERGE_ACTOR_TOKENto merge - the wrapper resolves and exports exactly one role token per process; reviewer and merge-actor credentials are never loaded together
- owner repository discovery requests every Gitea page through the terminal empty page and preserves first-seen repository order without duplicates
- merge only when
mergeable=trueand an explicit redacted status-authority record matches the exact owner/repository/PR/head, uses eventpull_request, and records a terminal-success run and job. The contract iscontracts/ci/scan_and_pull_status_authority_v1.json; aggregate commit state and latest contexts remain diagnostic and are not sufficient authority. The independent local approval record and the persisted GiteaAPPROVEDstate exactly match the current head; reviewer, author, and merge actor must be three distinct identities; any authority mismatch, missing field, or non-terminal/non-success run or job remains fail-closed - the merge request uses Gitea's documented lowercase
doaction field and includes the exact admittedhead_commit_id - approvals default to
artifacts/scan_and_pull/review_approvals.json; setSCAN_AND_PULL_REVIEW_APPROVALS_FILEor pass--review-approvals-filefor an explicit artifact override. The JSON object must contain anapprovalsarray of records withowner,repo,number,head, andreviewer; the reviewer must differ from the PR author. - the merge actor never closes issues; perform owner-bounded post-merge
evidence and a separate
GITEA_TOKENcloseout before changing issue state - a head reachable from its base while Gitea reports
merged=falseis anintegrated_pr_audit_conflict: Scan&Pull records it withmutation: noneand never closes or merges that PR. The conflict stays fail-closed for that PR but does not block evaluation of an unrelated candidate that satisfies every exact-head approval and CI gate. --dry-runis required for safe review or merge preview without mutation- status authority defaults to
artifacts/scan_and_pull/status_authority.json; setSCAN_AND_PULL_STATUS_AUTHORITY_FILEor pass--status-authority-file. Missing, stale, mismatched, non-terminal, unredacted, duplicate, or ambiguous authority evidence remains fail-closed.
Post-Merge Mainline Reconcile
- canonical post-merge reconcile entrypoint:
python scripts/post_merge_mainline_reconcile.py - canonical delivery evidence verifier:
python scripts/verify_agent_platform_delivery_evidence_lane.py - canonical delegated closeout verifier:
python scripts/verify_agent_delegated_closeout_evidence_lane.py - default posture:
- Gitea PR merge truth is authoritative
- reconcile only the directly affected repo
- local
mainreadback and remote owner-checkoutmainreadback are mandatory - runtime reconcile is owner-bounded and command-driven, not host-global
- runtime stays unreconciled until bounded runtime verify/readback succeeds
- the canonical closeout sequence remains:
gitea_merge_readback -> local_main_readback -> remote_owner_checkout_readback -> runtime_reconcile -> runtime_verify_against_running_main - delegated closeout bundles add one more bounded proof layer:
required artifact-bundle completeness plus visual evidence when the Fabric
work-type posture marks it
required - canonical post-merge replay for the <internal-runtime-redacted> heavy-workload guardrail:
bash scripts/host_verify_issue758_759_heavy_workload_guardrail.sh --exercise-heavy-lanes
- canonical
jhf-openclaw-envlane after merge of a runtime-relevant PR:python scripts/post_merge_mainline_reconcile.py \--pr 627 \--remote-host <internal-runtime-redacted> \--remote-user administrator \--remote-checkout <internal-home-redacted> \--remote-reconcile-command "bash scripts/host_reconcile_openclaw_env_checkout_main.sh --host <internal-runtime-redacted> --user administrator --allow-dirty-reset" \--runtime-source "systemd guardrail units plus repo-owned scripts under <internal-home-redacted>" \--runtime-reconcile-command "bash scripts/host_start_openclaw_guardrail.sh --host <internal-runtime-redacted> --user administrator --start-now" \--runtime-verify-command "bash scripts/host_openclaw_runtime_guardrail.sh --host <internal-runtime-redacted> --user administrator" \--runtime-verify-command "ssh <internal-runtime-redacted><internal-runtime-redacted> \"systemctl show jhf-openclaw-env-guardrail.service -p ExecMainStatus -p Result && systemctl show jhf-openclaw-env-guardrail.timer -p UnitFileState -p ActiveState -p SubState\""
Contracts and Policies
- STACK_RUNTIME_CONTRACT.md (
docs/STACK_RUNTIME_CONTRACT.md) - SSO_HTTPS_SURFACE_INVENTORY.md (
docs/SSO_HTTPS_SURFACE_INVENTORY.md) - ERP_IDENTITY_LIFECYCLE_BOUNDARY.md (
docs/ERP_IDENTITY_LIFECYCLE_BOUNDARY.md) - RUNTIME_PORT_OBSERVATION_POLICY.md (
docs/RUNTIME_PORT_OBSERVATION_POLICY.md) - SSO_V4_ENV_AUTH_RUNTIME.md (
docs/SSO_V4_ENV_AUTH_RUNTIME.md) - FUTURE_MODULE_RUNTIME_AUTH_ONBOARDING.md (
docs/FUTURE_MODULE_RUNTIME_AUTH_ONBOARDING.md) - SECRETS_AND_ENV_POLICY.md (
docs/SECRETS_AND_ENV_POLICY.md) - M365_FILE_GRAPH_PROFILE.md (
jhf-weft/docs/M365_FILE_GRAPH_PROFILE.md)
Incident/Recovery Runbooks
- AUTONOMOUS_RESTART_GUARDRAIL.md (
docs/AUTONOMOUS_RESTART_GUARDRAIL.md) - GITEA_ORG_RUNNER_RECOVERY_RUNBOOK.md (
docs/GITEA_ORG_RUNNER_RECOVERY_RUNBOOK.md) - ROLLBACK_AND_RECOVERY.md (
docs/ROLLBACK_AND_RECOVERY.md) - CLIENT_TLS_TRUST_RUNBOOK.md (
docs/CLIENT_TLS_TRUST_RUNBOOK.md)
Scan&Fix Runbook
Schnellstart
bash scripts/scan_and_fix.sh
- Processes this repo's open Gitea issue queue serially by default.
- Uses
prompts/scan_and_fix_execution_standard.mdas the runtime standard block.
Dry-Run
bash scripts/scan_and_fix.sh --dry-run
- Shows the selection and prompt preview.
- Does not dispatch an executor.
Live-Run (bounded)
bash scripts/scan_and_fix.sh --max-issues 5
- Runs a bounded serial pass for the first N issues in priority order.
Typische Fehlerbilder
GITEA_TOKEN missing: Token fehlt im kanonischen Operator-Env~/.config/helpifyr/operator.envoder inHELPIFYR_OPERATOR_ENV_FILE;.wird in der Scan-Lane nicht mehr als stiller Fallback akzeptiert.Cannot infer repo owner/name:originRemote oder--repo-owner/--repo-namekorrigieren.scan_and_fix requires a pushed branch: for the OpenClaw executor, first push the current branch tooriginor switch to a branch that already has a remote head; local reconcile-only branches without a remote head are now rejected fail-closed immediately.- Visible wait lines:
scanfix_runner_heartbeatorscanfix_executor_heartbeatmean that the serial run is still active; they are not a stuck lock, but the bounded heartbeat during an active agent turn. - Local Codex fallback: if no
--executor-cmdis set,scan_and_fix.shusesgpt-5.4by default; a different locally verified model can be selected withSCAN_AND_FIX_CODEX_MODEL. - Local executor failure: check the standard executor
scripts/scan_and_fix_openclaw_executor.sh(openclaw-gateway, SSH/host access, agent timeout); override it explicitly with--executor-cmdonly when needed.
License: AGPLv3 Project: https://helpifyr.com
Workspace Git/Scan Guardrails (Mandatory)
- Gitea is Source of Truth; local Windows workspaces are disposable working copies.
- Never run Codex sessions on
<local-workspace-redacted>root; always use a concrete repo path. - Limit active repo sessions to 2-3 in parallel.
- Before each run in a repo:
git fetch --prune,git checkout <branch>,git pull --ff-only. - No background git discovery loops (
git status,git ls-files, worktree scans) without explicit scoped need. - Automation scripts must run repo-scoped only, never global over
<local-workspace-redacted>.
scan_and_fix Standard
scripts/scan_and_fix.shmust resolve credentials throughscripts/operator_env.py, keep legacy root.envas compatibility fallback only, and fail closed when required keys are missing.scripts/scan_and_fix_openclaw_executor.shis the canonical repo-aware host executor when a live OpenClaw turn must prove workspace path + branch insideopenclaw-gateway.scripts/scan_open_issues_repo_only.shmust exist and query only current repo open issues via Gitea API.
Workspace Hygiene
- Daily cleanup: stale
_worktrees/*,_tmp/*,test-results/*, large temporary artifacts. - Weekly cleanup: stale local branches/worktrees.
- Never leave valuable artifacts as untracked files in workspace root.
Dirty-State Policy
- Dirty state is allowed while actively implementing.
- Before new scan/automation runs: commit/stash, or use a dedicated worktree.
- Never propagate
dirty_unknownstates.
Incident Playbook (git.exe storm)
- Identify parent of
git.exe(usually oneCodex.exe). - Stop only the offending process tree.
- Restart session on concrete repo path.
- Reduce parallel sessions.
- Verify
git.execount drops within 30-60s.
Weft Mail Public Surface DNS/Ingress Posture
- issue owner lane:
jhf-openclaw-env#1588
- parent future owner lane:
jhf-openclaw-env#1587
- upstream program:
jhf-weft#6
- bounded runtime expectations:
<internal-runtime-redacted>is admitted in the repo-owned AdGuard rewrite list for <internal-runtime-redacted>- Caddy terminates
tls internalfor<internal-runtime-redacted> - the public surface stays bounded to a redirect into
apps/mail - owner verify distinguishes missing DNS/ingress surfacing from later Weft/SSO/product gaps
- scope boundary:
- this lane proves bounded public DNS/TLS/redirect surfacing only
- it must not be overstated as standalone mail-product completion, mailbox provisioning, or Heddle SSO admission
Canonical bounded Weft <internal-runtime-redacted> <internal-runtime-redacted> host-preserving public surface lane (jhf-openclaw-env#1595)
- Canonical materializer:
bash scripts/host_materialize_issue1595_weft_mail_public_surface.sh
- Canonical verifier:
python scripts/verify_issue1595_weft_mail_public_surface.py --allow-blocked
- Upstream refs:
jhf-openclaw-env#1587jhf-weft#559jhf-heddle#298jhf-weft#6
- bounded runtime expectations:
<internal-runtime-redacted>/redirects only toapps/mail/apps/mail/,/login, and the OIDC launcher stay canonical on<internal-runtime-redacted>- if Heddle still rejects the rewritten mail callback, the verifier classifies
heddle_mail_redirect_uri_not_admitted
- scope boundary:
- this lane proves host-preserving public ingress/runtime surfacing only
- it must not be overstated as full Heddle admission, standalone mailbox-product completion, or broad selfhost mail readiness
Canonical bounded Weft <internal-runtime-redacted> <internal-runtime-redacted> trusted-domain and overwritehost runtime lane (jhf-openclaw-env#1597)
- Canonical materializer:
bash scripts/host_materialize_issue1597_weft_mail_host_ingress_runtime.sh
- Canonical verifier:
python scripts/verify_issue1597_weft_mail_host_ingress_runtime.py --allow-blocked
- Upstream refs:
jhf-weft#576jhf-openclaw-env#1595jhf-weft#559jhf-weft#6
- bounded runtime expectations:
- owner env truth in
compose/nextcloud-selfhost.envis upserted to the canonical mail-host values before reconcile nextcloud-selfhostis force-recreated from the reconciled env truth before OCC-level ingress reconcile runs- <internal-runtime-redacted> Nextcloud
trusted_domainsreadback contains<internal-runtime-redacted> - <internal-runtime-redacted>
overwritehostreads back<internal-runtime-redacted> - <internal-runtime-redacted>
overwrite.cli.urlreads backhttps://<internal-runtime-redacted> - bounded authenticated webmail verify is rerun against the canonical mail host after reconcile
- owner env truth in
- scope boundary:
- this lane proves owner-side Nextcloud config/runtime convergence for the canonical mail host
- it must not be overstated as broad selfhost mail product completion beyond the bounded webmail proof
Canonical bounded Weft <internal-runtime-redacted> dual-host OIDC callback runtime lane (jhf-openclaw-env#1600)
- Canonical materializer:
bash scripts/host_materialize_issue1600_weft_dual_host_oidc_callback.sh
- Canonical verifier:
python scripts/verify_issue1600_weft_dual_host_oidc_callback.py --allow-blocked
- Upstream refs:
jhf-openclaw-env#1600jhf-openclaw-env#1587jhf-weft#588jhf-heddle#298jhf-weft#6
- bounded runtime expectations:
apps/user_oidcstays canonical on<internal-runtime-redacted>apps/user_oidcstays canonical on<internal-runtime-redacted>- both launchers keep distinct encoded
redirect_uricallback hosts instead of collapsing onto one host - if Heddle still rejects one callback host, the verifier classifies the remaining blocker explicitly instead of overclaiming broad SSO admission
- scope boundary:
- this lane proves bounded dual-host launcher/callback canonicalization only
- it must not be overstated as broad Weft selfhost SSO completion, full logout/session admission, or mailbox-product completion