Requestor: John Mitchell
Project: Observability Framework Tooling (obsfw)
Date: 2026-07-22
Requesting a persistent runner environment to host the obsfw daily report pipeline, which currently runs on a local macOS launchd job. The pipeline generates multi-outcome observability reports for Ansible by pulling data from Jira, GitHub, GitLab, Slack, and Claude (LLM analysis), then publishes HTML reports to GitLab Pages. See https://nexus-observability-report-becce4.pages.redhat.com/multi-outcome/
- Run a Python 3.12 CLI tool (
obsfw) on a daily cron schedule - Execute the pipeline:
obsfw config pull→obsfw generate --analysis→obsfw publish→obsfw compliance --slack→obsfw digest --post-to-slack
- VPN / internal network access — must be able to reach
gitlab.cee.redhat.com(GitLab CE) for config sync and report publishing via GitLab API - Public internet — needs to reach Jira Cloud (
redhat.atlassian.net), GitHub (api.github.com), and Slack APIs
- Programmatic Claude access — the pipeline runs Claude (Opus model) to generate daily narrative analysis and release coordinator briefings
- Currently uses
claude --printCLI via Google Vertex AI. Need either:- Vertex AI service account credentials on the runner, OR
- Direct Anthropic API access (API key), OR
- Whatever the recommended path is for running Claude programmatically from an internal runner
- Slack bot token with channel read permissions — the pipeline reads messages from 11 Slack channels daily to produce a cross-channel digest for the ANSTRAT-1646 outcome. We anticipate other outcomes to follow suit once their configs get built up fromt he minimal case.
- Channels are all in the Red Hat Slack workspace (listed below)
- Required Slack scopes:
channels:history,channels:read(andgroups:history,groups:readif any are private) - Currently using
slackerCLI with browser-based auth — need a proper bot token for headless operation
Slack channels the bot needs read access to currently (again, this list will expand):
#to-be-deleted-formerly-wg-anstrat-1646-ao-ga(C0BJ453DBFB)#wg-anstrat-1845(C0BGWJR3JFP)#wg-anstrat-1956(C0BH1QNT3JM)#wg-anstrat-1972(C0BFAF35L3D)#wg-anstrat-2126(C0B7LUKFL84)#wg-anstrat-2162(C0BGVH02BT9)#wg-anstrat-2278(C0BHALMFN9J)#wg-anstrat-2399-quality-and-standards(C0BJJ0SLZR7)#wg-anstrat-2161-otel-docs(C0BJE3MMJQN)#wg-nexploration-labs(C0B69J86TRN)#wg-ansible-nexus(C09CN0WB4BW)
JIRA_USER_EMAIL+JIRA_API_TOKEN— Jira Cloud API authGITHUB_TOKEN— GitHub API (read access toautomation-nexusorg repos)- Slack bot token (new — see above)
- Claude / Vertex AI credentials (see above)
- GitLab auth for
gitlab.cee.redhat.com(token or SSH key for git push to pages repo)
- Python 3.12+
pip installsupport (the tool installs aspip install -e .)gitavailable (for GitLab pages repo operations)- Persistent storage for config files and data cache (~50MB)
- Cron or scheduled job support (runs once daily, ~8am ET)
- Ability to trigger ad-hoc runs/CI-based runs
- Log retention for debugging failed runs
- Alerting if the daily run fails
[launchd on macOS] → obsfw CLI → Jira API, GitHub API, GitLab (VPN), Slack (slacker), Claude (Vertex)
↓
GitLab Pages (nexus-observability-report)
[Internal runner] → obsfw CLI → Jira API, GitHub API, GitLab (internal network), Slack (bot token), Claude (TBD)
↓
GitLab Pages (nexus-observability-report)