Operations
Start / Run / Deploy
- production stack contract:
infra/docker/docker-compose.stack.yml - test stack contract:
infra/docker/docker-compose.test.yml - workflow reconcile path:
bash scripts/import_workflows.sh
The workflow reconcile path is fail-closed on auth drift: it uses N8N_API_KEY when valid and otherwise falls back to an owner login session via N8N_OWNER_EMAIL / N8N_OWNER_PASSWORD so that workflow Git truth can still be re-imported when the API key is stale.
Healthchecks
- n8n:
${N8N_BASE_URL}/healthz - ERiC:
${ERIC_HEALTHCHECK_URL}/healthand requireeric_available=truewhen the field is present
Readiness
- canonical readiness signal:
bash scripts/check_runtime_readiness.sh
bash scripts/check_runtime_readiness.sh --require-productive-provider
Default semantics:
bash scripts/check_runtime_readiness.shvalidates the repo-owned sandbox baseline and may still bereadywhile productive provider onboarding is intentionally not active yet.bash scripts/check_runtime_readiness.sh --require-productive-provideris the stricter operator path for productive provider sign-off.
For productive Storecove invoice dispatch, ready also requires:
-
STORECOVE_API_KEY -
STORECOVE_LEGAL_ENTITY_ID -
a Storecove tenant-side sender that is approved and carries the required sender identifiers for the active country lane
-
combined operator signal:
bash scripts/check_stack_state.sh
- stack ownership-only signal:
bash scripts/check_stack_ownership.sh
- stack/runtime contract signal:
bash scripts/check_stack_runtime_contract.sh
bash scripts/check_stack_runtime_contract.sh --live
python scripts/check_runtime_materialization_drift.py
python scripts/check_runtime_materialization_drift.py --live
bash scripts/materialize_eric_runtime.sh --cert-source <path-to-elster-pfx>
python scripts/check_elster_artifact_readiness.py --portal-only --portal-env-file <workspace-env-file>
python scripts/check_elster_artifact_readiness.py --live
python scripts/check_elster_artifact_readiness.py --expected-runtime-mode productive --vendor-root <local-elster-drop> --live
python scripts/export_live_port_observation.py --output artifacts/live-port-observation.json
There is still no dedicated HTTP readiness endpoint; this remains a documented gap.
Logs
- n8n execution logs (bounded only via
bash scripts/safe_docker_logs.sh jhf-wire-n8n) - ERiC service logs (bounded only via
bash scripts/safe_docker_logs.sh jhf-wire-eric) - provider responses surfaced through workflow execution details
- policy reference:
docs/HOST_DOCKER_LOG_GUARDRAILS.md
Monitoring
Today:
- CI status in Gitea
- operator scripts for readiness and smoke
- probe script for finAPI
- repeatable runtime load snapshot script:
bash scripts/capture_runtime_load_snapshot.sh <output.json>
Still missing:
- standardized metrics endpoint
- dashboard-fed publication of the Fabric metadata export
Alerts And Dashboard Signals
Operator-relevant alerts:
- callback failures to Helpifyr Spindle, especially callback target reachability and TLS trust mismatches
- readiness state drops from
readytopending - provider auth failures
- workflow import drift between Git and n8n
Useful dashboard signals:
- latest verified Git commit
- current CI state on Gitea
- readiness summary by dependency key
- health surface reachability for n8n and ERiC
- explicit ERiC binary availability signal from
/health - explicit ERiC runtime split from
/health:eric_runtime_availablevs.eric_submit_available - last successful finAPI live probe time
- count of callback failures by workflow
Non-HTTP Status Contracts
- Readiness is currently exposed only through:
bash scripts/check_runtime_readiness.shbash scripts/check_stack_state.shbash scripts/check_stack_runtime_contract.shpython scripts/check_runtime_materialization_drift.py
- Combined machine-readable status is currently exposed only through:
python scripts/export-fabric-metadata.py --pretty
- Controlled live host-port publication for consumers is exposed through:
python scripts/export_live_port_observation.py --output artifacts/live-port-observation.json
- Support-case delivery evidence and corner-case recovery posture are exposed through:
python scripts/validate_support_case_delivery.py --prettybash scripts/check_support_case_delivery.sh
- Metrics have no equivalent contract yet; this is still a real gap.
Known Error Shapes
- provider-side domain errors from finAPI VoP / IBAN Name Check
- Storecove sender lane incomplete (
STORECOVE_LEGAL_ENTITY_IDmissing, sender not approved yet, or sender identifiers missing) - callback endpoint mismatch or TLS trust failure (
bash scripts/check_callback_target.sh) - pending credentials causing readiness
pending - ELSTER sandbox runtime is an acceptable repo-owned baseline; productive ELSTER sign-off is a stricter follow-up path
- productive ELSTER still remains blocked while
ELSTER_TEST_MODE=true, a known test certificate path is mounted, or operator-owned cert material is missing; usepython scripts/check_elster_artifact_readiness.py --expected-runtime-mode productive --live - shared workspace portal credentials can be preflight-checked without leaking values via
python scripts/check_elster_artifact_readiness.py --portal-only --portal-env-file <workspace-env-file> - ERiC health reachable but
eric_available=false - ERiC runtime libraries present but
eric_submit_available=false - ERiC runtime inventory helper confirms missing runtime assets or wrong adapter paths:
bash scripts/check_eric_runtime_inventory.sh - host restore/drift removed
jhf-wire_eric_runtime; rematerialize withbash scripts/materialize_eric_runtime.sh --cert-source <path-to-elster-pfx>and rerun runtime checks - ELSTER vendor drop and cert-path materialization verifier:
python scripts/check_elster_artifact_readiness.py --vendor-root <local-elster-drop> --live - support notification retry/recovery posture is validated via
scripts/validate_support_case_delivery.py - compliance runtime issues are tracked in
jhf-selvage(moved scope)
Restart / Recovery Hints
- repair in Git first
- redeploy only stack-owned services
- re-import workflows
- re-run readiness and smoke checks
Runtime Dependencies
- Docker standalone runtime on the operator-managed OpenClaw host
- n8n
- ERiC service
- provider credentials and network reachability
External Blockers
- external and operator-owned productive follow-ups are tracked in
docs/EXTERNAL_BLOCKER_MATRIX.md - productive ELSTER is currently a deferred follow-up rather than an active sandbox blocker; repo-owned queue state must be read from live Gitea open issues instead of a hard-coded local list
Scan&Fix
- real queue source: live Gitea open issues for
JaddaHelpifyr/jhf-wire - repo-local scanner:
bash scripts/scan_open_issues_repo_only.sh - repo-local dispatcher:
bash scripts/scan_and_fix.sh --dry-run
bash scripts/scan_and_fix.sh --executor-cmd '<your bounded executor command>'
Rules:
- repo-scoped only; never run from the shared workspace root
- public Gitea read is allowed; token is optional for scanning and only needed for write-back lanes
- blocked/external issues stay visible in the queue but must not be silently treated as repo-owned fixes
License: AGPLv3 Project website: 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 the shared workspace 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 the shared workspace root.
scan_and_fix Standard
scripts/scan_and_fix.shmust enforce runner timeout + single-run lock + explicit repo-local or operator-provided.envdiscovery.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.